是否可以使用枚举符合StringLiteralConvertible?

Der*_*way 1 macos ios swift

尝试在枚举中采用StringLiteralConvertible时:

enum Component: StringLiteralConvertible {
    case Static(String)
    case AnyInt

    typealias ExtendedGraphemeClusterLiteralType = String
    typealias UnicodeScalarLiteralType = String

    init(unicodeScalarLiteral value: UnicodeScalarLiteralType) {
    }
    init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) {
    }
    init(stringLiteral value: String) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Variable 'self' used before initialized
Run Code Online (Sandbox Code Playgroud)

在每个初始化器中.

根据NSHipster,遵循该协议的正确方法涉及覆盖一个类func,它接受一个字符串文字并返回所需类/结构的对象.像这样:

static func convertFromStringLiteral(value: String) -> CGPoint {
    return NSPointFromString(value) // CGPointFromString on iOS
}
Run Code Online (Sandbox Code Playgroud)

在最近的一次Swift更新中有变化吗?是否可以采用StringLiteralConvertible作为枚举?

Mar*_*n R 5

StringLiteralConvertible协议已经改变和convertFromStringLiteral 功能已经不存在了.

您已经拥有所需的初始化程序.错误是您没有为其分配值self.示例实现:

enum Component: StringLiteralConvertible {
    case Static(String)
    case AnyInt

    init(stringLiteral value: String) {
        self = Static(value)
    }

    init(extendedGraphemeClusterLiteral value: String) {
        self = Static(value)
    }

    init(unicodeScalarLiteral value: String) {
        self = Static(value)
    }
}

let comp : Component = "Foo"
Run Code Online (Sandbox Code Playgroud)

Swift 3/4更新:

enum Component: ExpressibleByStringLiteral {
    case `static`(String)
    case anyInt

    init(stringLiteral value: String) {
        self = .static(value)
    }
}

let comp: Component = "Foo"
Run Code Online (Sandbox Code Playgroud)