我正在开始一个新的iOS Swift
项目。我需要添加一些所有项目类都应该继承的功能。与Objective C
不同,并不是Swift
中的所有类都继承自任何特定的类,即NSObject
。例如,
我无法创建Any
或AnyObject
类的扩展名,就像我可以为NSObject
创建的扩展名一样。例如,下面的代码确定。
extension NSObject {
@objc var classTag: String {
return String(describing: type(of: self))
}
}
但是,AnyObject
的扩展名会导致编译器错误,
非标称类型'AnyObject'无法扩展
所以,我决定使项目中的所有swift类都继承自实际上是从BaseClass
继承的NSObject
。
class BaseClass: NSObject {
@objc var classTag: String {
return String(describing: type(of: self))
}
}
和其他类,即
class OtherClass: BaseClass {
// have classTag
}
在为我的团队制定政策之前,要从BaseClass
继承所有类,我想知道默认情况下从NSObject
继承所有类是否存在一些缺点。
[如果您要使NSObject
可以被其他类继承,我什至不需要从BaseClass
继承。
您可以简单地在classTag
本身中添加BaseClass
,即
class BaseClass {
var classTag: String {
return String(describing: type(of: self))
}
}
class SubClass: BaseClass {
func someFunc() {
print(self.classTag)
}
}
另一种选择是使用protocol
和protocol extension
并提供classTag
的默认定义,即
protocol SomeProtocol {
var classTag: String { get }
}
extension SomeProtocol {
var classTag: String {
return String(describing: type(of: self))
}
}
然后,您可以在需要的地方,也就是SomeProtocol
符合类,即>]
class SubClass: SomeProtocol { func someFunc() { print(self.classTag) } }
在任何情况下,都不需要从
NSObject
继承,因为您不需要任何NSObject
特定的功能。
final
。启用整个模块优化后,Swift会在可能的情况下添加final,但不会在目标c类中添加。这是微优化,除非您有特殊情况,否则我不会考虑。