【问题标题】:CGPoint stringliteral not allowed anymore in iOS 8.1iOS 8.1 中不再允许 CGPoint stringliteral
【发布时间】:2014-11-09 12:04:17
【问题描述】:

在 iOS 8.0 中,我有这个枚举:

enum Direction:CGPoint {
    case Top = "{0, -1}"
    case Right = "{1, 0}"
    case Down = "{0, 1}"
    case Left = "{-1, 0}"

    case TopLeft = "{-1, -1}"
    case TopRight = "{1, -1}"
    case DownLeft = "{-1, 1}"
    case DownRight = "{1, 1}"

    case None = "{0, 0}"
}

extension CGPoint: StringLiteralConvertible {

    public static func convertFromStringLiteral(value: StringLiteralType) -> CGPoint {
        return CGPointFromString(value)
    }

    public static func convertFromExtendedGraphemeClusterLiteral(value: StringLiteralType) -> CGPoint {
        return convertFromStringLiteral(value)
    }
}

现在这正是我想要的方式,我不得不使用字符串,因为简单的 case Top = CGPoint(x:0,y:1) 不起作用。

我像这样使用它:

1. var Dir:Direction = .None
2. self.center.AddWithPoint(self.Dir.rawValue.multiply(CGFloat(Speed)))
3. bullet.Dir = .Right

现在这就是我在 8.1 之前使用枚举的方式,但现在不再允许了。

现在我收到一大堆这样的错误:

. Type 'CGPoint' does not conform to protocol 'StringLiteralConvertible'

. 'String' is not convertible to 'CGPoint'

那么有什么办法可以让它像以前一样工作吗?任何答案或建议表示赞赏!

【问题讨论】:

    标签: ios swift enums literals cgpoint


    【解决方案1】:

    StringLiteralConvertible 协议已更改,现在需要 初始化器

    protocol StringLiteralConvertible : ExtendedGraphemeClusterLiteralConvertible {
        typealias StringLiteralType
        init(stringLiteral value: StringLiteralType)
    }
    

    另外,它继承自

    protocol ExtendedGraphemeClusterLiteralConvertible : UnicodeScalarLiteralConvertible {
        typealias ExtendedGraphemeClusterLiteralType
        init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType)
    }
    

    继承自

    protocol UnicodeScalarLiteralConvertible {
        typealias UnicodeScalarLiteralType
        init(unicodeScalarLiteral value: UnicodeScalarLiteralType)
    }
    

    因此您可以将协议实现为:

    extension CGPoint: StringLiteralConvertible {
    
        public init(stringLiteral value: StringLiteralType) {
            self = CGPointFromString(value)
        }
    
        public init(extendedGraphemeClusterLiteral value: StringLiteralType) {
            self = CGPointFromString(value)
        }
    
        public init(unicodeScalarLiteral value: StringLiteralType) {
            self = CGPointFromString(value)
        }
    }
    

    示例用法:

     print(Direction.Top.rawValue)
     // Output: (0.0,-1.0)
    

    【讨论】:

    • 谢谢!我不知道他们改变了文字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2016-01-18
    • 2019-12-05
    相关资源
    最近更新 更多