swift有运行时特性吗?
Swift 没有运行时特性,它是一门静态语言。
Swift extensions(扩展) 在给已经存在cocoa系统类添加功能提供了巨大的灵活性,
但是和OC一样存在着一样的问题:category的局限性;
也就是说你不能通过扩展添加一个属性给已经存在的类,不过OC的runtime关联属性的方法在解决category的局限性上起了巨大的作用。
因为OC可以和Swift混编,可以互用各自的方法和类, 所以swift可以使用OC的runtime的接口.
swift和OC的运行时有区别吗?
除了语法上的区别外,原理都是一样的,Swift是使用OC的runtime接口间接拥有了运行时的特性
swift的runtime怎么用呢?
//以比较常用的给类别添加属性功能来说
public extension UIViewController {
var lyHud: LYProgressHUD {
get {
let pointer = UnsafeRawPointer(bitPattern: "_buttfly_MBProgressHUD_lyHud".hashValue)!
let hud = objc_getAssociatedObject(self, pointer) as? LYProgressHUD
if let hud = hud {
return hud
} else {
let hud = LYProgressHUD(view: view)
hud.bezelView.style = .solidColor
objc_setAssociatedObject(self, pointer, hud, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return hud
}
}
}
func ly_showLoadingHUD(text: String?, autoHideDelay: TimeInterval = 0) -> Void {
DispatchQueue.ly_mbph_runInMain {
self.lyHud.loadingHud(text: text)
self.view.addSubview(self.lyHud)
self.lyHud.show(animated: true, autoHideDelay: autoHideDelay)
}
}
}
Swift的extension(扩展)可以添加方法和属性吗?
上面举的例子就是swift在扩展里面给原类添加属性。添加方式是可以直接添加的。
参考文章:
Swift runtime简解