gpt4 book ai didi

swift - 如何在 Swift 中使用字符串作为 Printables

转载 作者:搜寻专家 更新时间:2023-10-31 22:35:15 24 4
gpt4 key购买 nike

我正在尝试编写一个接受可打印类型参数的函数:

func logMessage(message: Printable) {
// ...
}

奇怪的是,当传入字符串时,这并没有像预期的那样工作。

这不编译:

logMessage("some string \(someVariable)")

// Neither does this:
let aString = "aString"
logMessage(aString)

但是编译:

logMessage("A string")
// This works too:
let aString: Printable = "a string"
logMessage(aString)

这很令人困惑。似乎在某些情况下 String 实现了 Printable 而在其他情况下则没有。

另外,似乎字符串插值总是产生一个没有实现Printable的String。这会在运行时因转换错误而崩溃:

let aString = "a string"
let interpolatedString = "contains \(aString)"

知道这里发生了什么吗?

最佳答案

String 不符合 Printable 是对的。编译的原因:

let aString: Printable = "Ceci n'est pas une String"

是你不是用那个文字创建一个String——你是在创建一个NSString( Printable )。

一般来说,在 Swift 中,编写受协议(protocol)约束的泛型函数通常会更好。所以不是

func logMessage(message: Printable) {
// ...
}

你可能最好写:

func logMessage<T: Printable>(message: T) {
// ...
}

这种方法有很多优点——更好的类型安全和避免类型删除、更高的性能等。您可以阅读更多关于这个东西的信息 here .

但是您仍然会遇到问题,因为您无法传入 String。您在这里有两个选择。首先,根本不要限制它:

func logMessage<T>(message: T) {
// ...then use toString(message) to create a String if you need one,
// or use string interpolation or print()
}

这将适用于 String,事实上也适用于任何不是 Printable 的东西(尽管你会得到一个非常无用的输出,涉及损坏的类名)。

或者,您可以使用 Streamable 字符串 符合:

func logMessage<T: Streamable>(message: T) {
println(message)
}

let s: String = "hello"
logMessage(s)

我想我之前在推特上读到 Swift 团队中的一个人提到 String 不符合 Printable 的原因正是因为他们不想要直接使用 Printable 的人喜欢这样,最好总是使用 toString 或类似的。

关于swift - 如何在 Swift 中使用字符串作为 Printables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com