作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当尝试像这样在枚举中采用 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) {
}
}
我收到以下错误:
Variable 'self' used before initialized
在每个初始化器中。
根据 NSHipster ,符合该协议(protocol)的正确方法涉及覆盖一个类 func,该类 func 采用字符串文字并返回所需类/结构的对象。像这样:
static func convertFromStringLiteral(value: String) -> CGPoint {
return NSPointFromString(value) // CGPointFromString on iOS
}
这在最近的 Swift 更新中有变化吗?是否可以采用 StringLiteralConvertible 作为枚举?
最佳答案
StringLiteralConvertible
协议(protocol)已经改变,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"
Swift 3/4 更新:
enum Component: ExpressibleByStringLiteral {
case `static`(String)
case anyInt
init(stringLiteral value: String) {
self = .static(value)
}
}
let comp: Component = "Foo"
关于ios - 是否可以使用枚举来符合 StringLiteralConvertible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26868881/
我是一名优秀的程序员,十分优秀!