gpt4 book ai didi

ios - 协议(protocol)扩展在 Swift 中是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 19:38:38 24 4
gpt4 key购买 nike

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

我无法创建 Any 的扩展名或 AnyObject上课,我可以为 NSObject .例如,下面的代码是可以的。

extension NSObject {

@objc var classTag: String {
return String(describing: type(of: self))
}
}

但是,扩展 AnyObject给出编译器错误,

Non-nominal type 'AnyObject' cannot be extended



所以,我决定让我的项目中的所有 swift 类都继承自我的 BaseClass。这实际上是从 NSObject 继承的.
class BaseClass: NSObject {

@objc var classTag: String {
return String(describing: type(of: self))
}
}

和其他类,即
class OtherClass: BaseClass {
// have classTag
}

在我为我的团队制定策略之前,从 BaseClass 继承所有类, 我想知道从 NSObject 继承所有类是否有一些缺点默认情况下。

最佳答案

  • 从 NSObject 继承的类不能是 final .虽然开启了整个模块优化,但 Swift 会尽可能添加 final 但不会在 objective-c 类中添加。这是微优化,除非您有特殊情况,否则我真的不会考虑。
  • 在考虑使用复制语义(使用结构)时,您将无法通过继承来扩展结构。
  • 您将在 IDE 的自动完成中添加很多噪音。
  • 使用协议(protocol) (POP) 可以为您提供更大的灵 active /能力。像条件一致性等......如果需要,您可以扩展 NSObject 。

  • 考虑使用 protocol extension也许是结构而不是 NSObject .
    protocol Base {
    func work()
    }

    extension Base {
    func work() {...}
    }

    struct AppState: Base {}

    AppState().work()

    关于ios - 协议(protocol)扩展在 Swift 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58710625/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com