Передача / установка переменных для ExpressibleByXXXXЛитеральные типы не работают - PullRequest
0 голосов
/ 10 июля 2019

Здесь у меня есть пример объекта, соответствующего 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 Ответ

1 голос
/ 10 июля 2019

ExpressibleByStringLiteral означает дать вам сокращение для вызова init(stringLiteral value: String) строковым литеральным выражением. Поскольку string не является литералом, он не может вызвать эту сокращенную запись. Вы должны вызвать инициализатор явно.

let string : String = "example"
bar(foo: Foo(stringLiteral: string))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...