gpt4 book ai didi

Swift 实现 LiteralConvertible 协议(protocol)

转载 作者:搜寻专家 更新时间:2023-11-01 06:24:16 26 4
gpt4 key购买 nike

我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com