代码之家  ›  专栏  ›  技术社区  ›  Zonily Jame

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

  •  0
  • Zonily Jame  · 技术社区  · 5 年前

    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 回复  |  直到 5 年前
        1
  •  1
  •   Ricky Mo    5 年前

    ExpressibleByStringLiteral 意思是给你一个可以调用的速记 init(stringLiteral value: String) string 不是文字,它不能触发这个速记。必须显式调用初始化器。

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