gpt4 book ai didi

swift - ExpressibleByStringLiteral 在函数参数中带有 optional 项

转载 作者:行者123 更新时间:2023-12-03 23:04:59 26 4
gpt4 key购买 nike

考虑以下枚举

enum Text: Equatable {
case plain(String)
case attributed(NSAttributedString)
}
我让它符合 ExpressibleByStringLiteral
extension Text: ExpressibleByStringLiteral {
public typealias StringLiteralType = String

public init(stringLiteral value: StringLiteralType) {
self = .plain(value)
}
}
有了这一切,我可以像我期望的那样执行以下操作:
let text: Text = "Hello" // .plain("Hello")
let text2: Text? = "Hello" // .plain("Hello")
但是我收到以下编译器错误:
let nilString: String? = nil
let text3: Text? = nilString // Cannot convert value of type 'String?' to expected argument type 'Text?'

func foo(text: Text?) { /** foo **/ }
let text = "Hello"
foo(text: text) // Cannot convert value of type 'String' to expected argument type 'Text?'

func bar(text: Text?) { /** bar **/ }
bar(text: nilString) // Cannot convert value of type 'String?' to expected argument type 'Text?'
我怎样才能让这些工作?
我也试过扩展 Optional: ExpressibleByStringLiteral where Wrapped: ExpressibleByStringLiteral ,但这没有帮助。

最佳答案

ExpressibleByStringLiteral 不是关于自动将(String, Int) 转换为您的自定义类型。字面意思就是"word" ( 字符串文字 ) 或 12.63 ( 双字面量 )。
但在你的例子中 let text = "Hello"常量文本类型为 字符串 .但是方法 foo 期望类型 文本? 为论据。
但是你可以像这样使用它

foo(text: "Some text")
现在编译器知道它可以将您的字符串文字转换为文本。然后包裹成 Optional<Text> .

关于swift - ExpressibleByStringLiteral 在函数参数中带有 optional 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63265871/

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