在ExpressibleByXXXXLiteral类型上传递/设置变量不起作用

时间:2019-07-10 02:22:26

标签: swift

这里有一个符合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类型的方法,这似乎无处不在。

我可以在这里使用替代方法吗?

1 个答案:

答案 0 :(得分:1)

ExpressibleByStringLiteral的意思是为您提供通过字符串文字表达式调用init(stringLiteral value: String)的快捷方式。由于string不是文字,因此它无法触发此速记。您必须显式调用初始化程序。

let string : String = "example"
bar(foo: Foo(stringLiteral: string))