从NSObject继承所有类的缺点是什么?

问题描述 投票:1回答:2

我正在开始一个新的iOS Swift项目。我需要添加一些所有项目类都应该继承的功能。与Objective C不同,并不是Swift中的所有类都继承自任何特定的类,即NSObject。例如,

我无法创建AnyAnyObject类的扩展名,就像我可以为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继承所有类是否存在一些缺点。

swift inheritance nsobject
2个回答
1
投票

[如果您要使NSObject可以被其他类继承,我什至不需要从BaseClass继承。

您可以简单地在classTag本身中添加BaseClass,即

class BaseClass {
    var classTag: String {
        return String(describing: type(of: self))
    }
}

class SubClass: BaseClass {
    func someFunc() {
        print(self.classTag)
    }
}

另一种选择是使用protocolprotocol 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特定的功能。


1
投票
  • 从NSObject继承的类不能为final。启用整个模块优化后,Swift会在可能的情况下添加final,但不会在目标c类中添加。这是微优化,除非您有特殊情况,否则我不会考虑。
© www.soinside.com 2019 - 2024. All rights reserved.