swift – 如何使用CGPoint的原始类型创建枚举?
发布时间:2020-12-14 05:58:03 所属栏目:百科 来源:网络整理
导读:灵感来自于 this question. Swift支持使用任何原始类型创建枚举,所以能够使用原始类型的CGPoint创建枚举将是很好的。 但这段代码不会编译 enum MyEnum : CGPoint { case Zero} 有以下错误 REPL:50:15: error: raw type 'CGPoint' is not convertible from a
灵感来自于
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来声明枚举?
给定代码有两个错误。
第一个是 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)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |