【问题标题】:Can someone explain difference between class and NSObjectProtocol有人可以解释类和 NSObjectProtocol 之间的区别吗
【发布时间】:2017-04-03 22:21:51
【问题描述】:

基本上我想知道这之间的区别

protocol ViewDelegate: class { 
  func someFunc()
}

还有这个

protocol ViewDelegate: NSObjectProtocol { 
  func someFunc()
}

有什么不同吗??

【问题讨论】:

  • 上边是对象,下边是同样符合NSObjectProtocol的对象。 stackoverflow.com/a/24067969/1068243
  • @almas 两者都不是对象。顶部是一个只能由类使用的协议,而不是枚举或结构。
  • 我的错。 top 是可以被任何对象(但不是 struct)实现的协议,bottom 是协议 NSObjectProtocol 的扩展。
  • 当我需要为该协议设置弱引用时应该使用什么?

标签: swift


【解决方案1】:

只有 Object 或 Instance 类型可以同时符合这两种类型的协议,其中 Structure 和 Enum 不能同时符合这两种类型

但主要区别在于: 如果一个人声明一个像下面这样的协议意味着它正在继承 NSObjectProtocol

protocol ViewDelegate: NSObjectProtocol { 
    func someFunc()
}

如果符合的类不是NSObject 的子类,那么该类需要在其中包含NSObjectProtocol 方法实现。 (一般情况下,NSObject 确实符合 NSObjectProtocol

例如:

class Test1: NSObject, ViewDelegate {
   func someFunc() {
   }
   //no need to have NSObjectProtocol methods here as Test1 is a child class of NSObject
}

class Test2: ViewDelegate {
       func someFunc() {
       }
       //Have to implement NSObjectProtocol methods here
    }

如果一个像下面这样声明,这意味着只有对象类型可以通过实现它的方法来符合它。没有什么额外的。

protocol ViewDelegate: class { 
  func someFunc()
}

【讨论】:

    【解决方案2】:

    当与类确认时,这意味着我们只制作对象类型。所以我们可以将它声明为弱或强 但是当与 NSObjectProtocol 确认时,我们将其设为对象类型,也可以实现 NSObjectProtocol 方法。这已经在 NSObjectProtocol 委托中定义了。 因此,由您决定以哪种方式确认您的代表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-10
      • 2019-05-14
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多