我正尝试在 Swift 1.2 中为我的 iOS 应用程序实现“深色”模式功能,并且正在考虑编写 UIColor 的扩展或子类。我想知道是否可以覆盖 UIColor.whiteColor()、UIColor.blackColor() 和其他内置颜色。如果不是,那么为整个应用程序实现暗模式的更好方法是什么?以下代码不能用作扩展。
class func whiteColor() -> UIColor {
return UIColor(...)
}
因为它与 UIColor 中现有的 whiteColor() 声明冲突。
谢谢!
最佳答案
这是针对您问题的“覆盖”部分的 Swift 3 答案。下面的代码片段包含占位符。它将系统实现与您自己的实现交换。
extension UIColor {
// ******************************************************************
// MARK: - Override black with own implementation
// ******************************************************************
override open class func initialize() {
if self == UIColor.self {
let blackMethod = class_getClassMethod(self, #selector(getter: black))
let myBlackMethod = class_getClassMethod(self, #selector(getter: myBlack))
method_exchangeImplementations(blackMethod, myBlackMethod)
let whiteMethod = class_getClassMethod(self, #selector(getter: white))
let myWhiteMethod = class_getClassMethod(self, #selector(getter: myWhite))
method_exchangeImplementations(whiteMethod, myWhiteMethod)
}
}
// for a light background
open class var myBlack: UIColor {
return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
}
// for a dark background
open class var myWhite: UIColor {
return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
}
}
initialize 的覆盖不再起作用,所以我将为 Swift 4 提供一个解决方案:
extension UIColor {
// ******************************************************************
// MARK: - Override black with own implementation
// ******************************************************************
static let classInit: Void = {
let blackMethod = class_getClassMethod(UIColor.self, #selector(getter: black))
let myBlackMethod = class_getClassMethod(UIColor.self, #selector(getter: myBlack))
method_exchangeImplementations(blackMethod, myBlackMethod)
let whiteMethod = class_getClassMethod(UIColor.self, #selector(getter: white))
let myWhiteMethod = class_getClassMethod(UIColor.self, #selector(getter: myWhite))
method_exchangeImplementations(whiteMethod, myWhiteMethod)
}()
// for a light background
open class var myBlack: UIColor {
return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
}
// for a dark background
open class var myWhite: UIColor {
return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
}
}
您在 AppDelegate
初始化后立即调整方法:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
override init() {
super.init()
UIColor.classInit
}
...
}
关于objective-c - 覆盖 Swift UIColor 类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320593/