协议扩展如何在Swift中工作?

我正在启动一个新的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继承所有类之前,我想知道默认情况下从Breakpoint 1,other_MAIT_create (max_deno=10,MAIT_node=0x7fffffffdad0,nume=9,deno=1024,output_site=0x7fffffffdb10,parent=0x7fffffffdaf0,MAIT_sign=3,save_num=0x7fffffffdab4) at create.cpp:33 33 clean_sign(MAIT_node); (gdb) n 35 for(unsigned int i=max_deno-1;i>-1;i--) (gdb) n 8 two_d_node node_split; (gdb) n 7 node split_single; (gdb) n 6 infor split_temp; (gdb) n 93 } (gdb) n main (argc=1,argv=0x7fffffffdc98) at main.cpp:32 32 for(unsigned int i=2;i<number;i++) 继承所有类是否存在一些缺点。

as980427 回答:协议扩展如何在Swift中工作?

如果您要使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的特定功能。

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

考虑使用protocol extension,也许使用结构而不是NSObject

protocol Base {
  func work()
}

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

struct AppState: Base {}

AppState().work()
本文链接:https://www.f2er.com/3159948.html

大家都在问