考虑两个私有方法UIColor
:
- 实例方法
styleString
返回颜色的 RGB 字符串
- 类方法
_systemDestructiveTintColor
它返回破坏性按钮使用的红色。
UIColor.h 私有标头供参考 https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UIColor.h
例如方法,我可以创建一个@objc
协议和使用unsafeBitCast
公开私有方法:
@objc protocol UIColorPrivate {
func styleString() -> UIColor
}
let white = UIColor.whiteColor()
let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
whitePrivate.styleString() // rgb(255,255,255)
但是,我不确定这对于类方法如何工作。
第一次尝试:
@objc protocol UIColorPrivate {
class func _systemDestructiveTintColor() -> String // Error: Class methods are only allowed within classes
}
有道理,我改一下static
:
@objc protocol UIColorPrivate {
static func _systemDestructiveTintColor() -> String
}
let colorClass = UIColor.self
let privateClass = unsafeBitCast(colorClass, UIColorPrivate.self) // EXC_BAD_ACCESS
这会导致崩溃。好吧,这不会很快发生。我可以使用桥接标头并将类方法公开为@interface
,但是有没有办法在纯 Swift 中公开这些私有类方法呢?
我可以这样做performSelector
,但我宁愿将该方法公开为接口或协议:
if UIColor.respondsToSelector("_systemDestructiveTintColor") {
if let red = UIColor.performSelector("_systemDestructiveTintColor").takeUnretainedValue() as? UIColor {
// use the color
}
}