首页 > 解决方案 > Swift:可以禁用结构的隐式字符串插值吗?

问题描述

我使用包装多语言字符串的结构,很容易意外打印结构类型名称而不是字符串,如下所示:

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 编译器产生错误或警告,我可以注意到并修复ss.en.

标签: swift

解决方案


您可以使用CustomStringConvertible协议来自定义文本表示。 苹果文档

在该属性中,您可以使用from或fromdescription将日志记录添加到控制台。os_logos.logNSLogFoundation

例子

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"!

推荐阅读