category
@interface ClassName (CategoryName)
@end
extension 又被稱為匿名分類(anonymous category)
@interface ClassName ()
@end
可以在 extension 的{}
中添加自定義的實例變量
@interface XYZPerson () {
id _someCustomInstanceVariable;
}
...
@end
主要區(qū)別
- Category是運行時決定生效的,Extension是編譯時就決定生效的
- Category可以為系統(tǒng)類添加分類,Extension不能。
- Category是有聲明和實現(xiàn),Extension直接寫在宿主.m文件,只有聲明。
- Category只能擴充方法,不能擴充成員變量和屬性。
- 如果Category聲明了一個屬性,那么Category只會生成這個屬性的set,get方法的聲明,也就不是會實現(xiàn) get set 方法。屬性的實例變量無法被存儲,除非是原有類的實例變量。
- 如果我們在 extension 中添加了方法, 那么這些方法必須在類的實現(xiàn)中實現(xiàn)。
參考:https://juejin.cn/post/6960972413240606734
swift 不能在 extension 中添加存儲屬性,但可以通過 AssociatedKey 的方式來間接實現(xiàn)。
public extension UIView {
private struct AssociatedKey {
static var identifier: String = "identifier"
}
public var identifier: String {
get {
return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
}
set {
objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
}
}
}
參考:https://juejin.cn/post/6856416734577410055
swift 的 extension 相當于影分身,每個分身可以具有不同技能(遵循了某個協(xié)議或數(shù)據(jù)源或新定義一下方法)文章來源:http://www.zghlxwxcb.cn/news/detail-741440.html
swift 的 category 寫法:extension name
on SomeClass
文章來源地址http://www.zghlxwxcb.cn/news/detail-741440.html
extension SomeName on DateTime {
}
到了這里,關(guān)于Category 和 Extension 的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!