Swift:可以为struct禁用隐式字符串插值吗?

rks48beu  于 12个月前  发布在  Swift
关注(0)|答案(2)|浏览(131)

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

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

7uhlpewt

7uhlpewt1#

我还在寻找一种方法来禁用自定义类型的字符串插值,这种方法会导致编译时错误。我找到了一种方法,并认为我会分享给将来想要这样做的任何人:
您可以通过为类型提供两种不同的插值来实现这一点,从而导致Ambiguous use of 'appendInterpolation'编译器错误。
一种可重复使用的方法可以像这样:

protocol DisableInterpolatePart1 {}
protocol DisableInterpolatePart2 {}
protocol DisableInterpolation: DisableInterpolatePart1, DisableInterpolatePart2 {}
extension DefaultStringInterpolation {
    mutating func appendInterpolation(_ value: some DisableInterpolatePart1) {
        appendInterpolation("don't interpolate me!")
    }
    mutating func appendInterpolation(_ value: some DisableInterpolatePart2) {
        appendInterpolation("don't interpolate me!")
    }
}

字符串
然后将DisableInterpolation协议一致性添加到要禁用插值的类型,如下所示:

struct MyType: DisableInterpolation {
    let value: String = "Hi"
}


然后,当你像print("Value is \(myValue)")一样插值时,编译器会报错,说Ambiguous use of 'appendInterpolation'

**注意:**如果你只做print(myValue),这不会导致编译器错误,它只会在做字符串插值时导致错误。这对我的用例来说已经足够了。

rmbxnbpk

rmbxnbpk2#

您可以使用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"!

字符串

相关问题