这里有一个符合ExpressibleByStringLiteral
的对象的例子
struct Foo: ExpressibleByStringLiteral {
var raw: String
init(stringLiteral value: String) {
self.raw = value
}
}
现在使用它就像这些一样简单
func bar(foo: Foo) {}
let foo1: Foo = "example"
let foo2 = "example" as Foo
bar(foo: "example")
bar(foo: foo1)
bar(foo: foo2)
但是执行以下操作将无效
let string: String = "example"
bar(foo: string) // Cannot convert value of type 'String' to expected argument type 'Foo'
let foo: Foo = string // Cannot convert value of type 'String' to specified type 'Foo'
bar(foo: string as Foo) // Cannot convert value of type 'String' to type 'Foo' in coercion
// Even string interpolation doesn't work which is weird because it's a string
bar(foo: "\(string)" // Cannot convert value of type 'String' to expected argument type 'Foo'
String
是否也符合ExpressibleByStringLiteral
?我已经尝试过使用其他ExpressibleBy
类型的方法,这似乎无处不在。
我可以在这里使用替代方法吗?
答案 0 :(得分:1)
ExpressibleByStringLiteral
的意思是为您提供通过字符串文字表达式调用init(stringLiteral value: String)
的快捷方式。由于string
不是文字,因此它无法触发此速记。您必须显式调用初始化程序。
let string : String = "example"
bar(foo: Foo(stringLiteral: string))