【问题标题】:Swift: Possible to disable implicit string interpolation for struct?Swift:可以禁用结构的隐式字符串插值吗?
【发布时间】:2021-04-27 21:39:04
【问题描述】:

我使用包装多语言字符串的结构体,很容易不小心打印出结构体类型名称而不是字符串,像这样:

struct MultilangStringStruct {
    let en: String
    let de: String
    
    init(en: String, de: String) {
        self.en = en
        self.de = de
    }
}

let s = MultilangStringStruct(en: "Of course", de: "Jawohl")

/// Oops, we forgot to use s.en, and it prints this, with no compiler warning:
/// Commander said "MultilangString(en: "Of course", de: "Jawohl")"!
print("The commander said \"\(s)\"!")

我可以修改结构以防止这种隐式转换为字符串吗?我希望 swift 编译器产生我能注意到的错误或警告,并将 s 修复为 s.en

【问题讨论】:

  • 您可以自定义字符串插值本身。 (但不适用于 print 命令。)
  • 你可以在运行时采用 CustomStringConvertible 和 barf,但你不能在编译时做任何事情,不。
  • 我认为使用 print 并不是真正的目的,所以如果可能的话,我会尝试通过编写单元测试来解决这个问题。

标签: swift


【解决方案1】:

您可以使用CustomStringConvertible 协议来自定义文本表示。 Apple doc

description 属性中,您可以使用os.log 中的os_logFoundation 中的NSLog 将日志记录添加到控制台。

示例

import os.log

struct MultilangStringStruct {
    let en: String
    let de: String

    init(en: String, de: String) {
        self.en = en
        self.de = de
    }
}

extension MultilangStringStruct: CustomStringConvertible {
    var description: String {
        os_log(.error, "Not implemented")
        return "Not implemented"
    }
}

let s = MultilangStringStruct(en: "Of course", de: "Jawohl")

print("The commander said \"\(s)\"!")

// Console output
1968-04-26 01:23:47.346953+0300 YourApp[85507:7491471] MultilangStringStruct: Not implemented
The commander said "Not implemented"!

【讨论】:

  • 是的,我已经在评论中说过了。但这不是 OP 要求做的。
  • 谢谢,我至少可以在那里打电话给assertionFailure(),并希望这能在开发中被抓住——比当前状态更好,即使我更喜欢编译时错误/警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
相关资源
最近更新 更多