微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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来声明枚举?

给定代码有两个错误

一个

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-litera

只有三种类型的文字,所以字符串是唯一的选择这里(除非你要1.2是(1,2))

原文地址:https://www.jb51.cc/swift/320713.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐