- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在 UIColor
上实现 IntegerLiteralConvertible 协议(protocol)。我真正想做的是这个
let black: UIColor = 0x000000
我首先尝试在此处关注 swift 博客 https://developer.apple.com/swift/blog/?id=8这不是开箱即用的。看来根据 swift in flux https://github.com/ksm/SwiftInFlux#literalconvertible-protocols-use-constructor他们不再使用 convertFromIntegerLiteral 而是使用初始值设定项。因此,这就是我们应该拥有的:
extension UIColor: IntegerLiteralConvertible {
public convenience init(integerLiteral value: IntegerLiteralType) {
UIColor(red: 1, green: 0, blue: 0, alpha: 1)
}
}
但是初始化器内部是什么?我不能自己设置。我想说类似的话
self.init(red: 0, green: 0, blue: 0, alpha: 1)
那是行不通的,而且看起来也行不通。我收到错误“初始化程序要求 init(IntegerLiteral) 只能由非最终类‘UIColor’定义中的‘必需’初始化程序满足”,这不是很有帮助。关于如何使这项工作有任何想法吗?
最佳答案
这是 Swift 2.0 的(解决方法)代码:
public class Color: UIColor, IntegerLiteralConvertible {
public typealias IntegerLiteralType = UInt32
public required init(integerLiteral value: IntegerLiteralType) {
let a = CGFloat((value & 0xFF000000) >> 24) / 255.0
let r = CGFloat((value & 0xFF0000) >> 16) / 255.0
let g = CGFloat((value & 0xFF00) >> 8) / 255.0
let b = CGFloat((value & 0xFF)) / 255.0
super.init(red: r, green: g, blue: b, alpha: a)
}
required public init(colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float) {
super.init(red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha: CGFloat(alpha))
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
关于Swift 实现 LiteralConvertible 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26498391/
我 90% 确定这是预期的行为,但在那种情况下,我只想接受教育! 在我的项目中,我定义了一个符合 IntegerLiteralConvertible 协议(protocol)的温度结构: struct
我正在阅读有关 LiteralConvertible 协议(protocol)的内容(让我们以 StringLiteralConvertible 为例),我发现在 swift 1.2 中,您可以使用从
我正在尝试在 UIColor 上实现 IntegerLiteralConvertible 协议(protocol)。我真正想做的是这个 let black: UIColor = 0x000000 我
我是一名优秀的程序员,十分优秀!