前端之家收集整理的这篇文章主要介绍了
swift – 如何使用CGPoint的原始类型创建枚举?,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
灵感来自于
this question. Swift
支持使用任何原始类型创建枚举,所以能够使用原始类型的CGPoint创建枚举将是很好的。
但这段代码不会编译
enum MyEnum : CGPoint {
case Zero
}
有以下错误
<REPL>:50:15: error: raw type 'CGPoint' is not convertible from any literal
enum MyEnum : CGPoint {
^
<REPL>:51:10: error: enum cases require explicit raw values when the raw type is not integer literal convertible
case Zero
^
那么如何用原始类型的CGPoint来声明枚举?
@H_
404_12@
给定
代码有两个
错误。
第一个是
error: raw type 'CGPoint' is not convertible from any literal
enum MyEnum : CGPoint {
所以我们需要使CGPoint从文字转换
解决它的一个方法是扩展CGPoint,使其可以通过符合StringLiteralConvertible从String文字转换
extension CGPoint : StringLiteralConvertible {
static func convertFromStringLiteral(value: String) -> CGPoint {
return NSPointFromString(value) // CGPointFromString on iOS
}
static func convertFromExtendedGraphemeClusterLiteral(value: String) -> CGPoint {
return NSPointFromString(value) // CGPointFromString on iOS
}
}
我们现在可以从字符串文字创建CGPoint!
var p : CGPoint = "2,3"
println(p) // print (2.0,3.0)
第二个错误是
error: enum cases require explicit raw values when the raw type is not integer literal convertible
case Zero
^
这很容易修复,只需要分配一些字符串字面值即可
enum MyEnum : CGPoint {
case Zero = "0,0"
case One = "1,1"
case MagicPoint = "0,42"
}
println(MyEnum.Zero.toRaw()) // (0.0,0.0)
println(MyEnum.One.toRaw()) // (1.0,1.0)
println(MyEnum.MagicPoint.toRaw()) // (0.0,42.0)
现在你已经枚举了CGPoint的原始类型
使用它
if let p = MyEnum.fromRaw(CGPoint(x:0,y:42)) {
switch (p) {
case .Zero:
println("p is (0,0)")
break
case .One:
println("p is (1,1)")
break
case .MagicPoint:
println("p is magic point")
break
}
}
// print "p is magic point"
从元组创建CGPoint会更好,但是看起来是不可能的。
从grammar
literal → integer-literal floating-point-literal string-literal
只有三种类型的文字,所以字符串是唯一的选择这里(除非你要1.2是(1,2))