swift协议'weak'不能应用于非类类型

时间:2015-11-02 06:25:32

标签: swift protocols

我有点困惑。 protocol A : class { ... }protocol A{ ... }之间有什么区别,我们应该在swift中使用哪一个?

PS:我们写这样的时候出错了

protocol A{ ... }

weak var delegate: A

错误:'weak'不能应用于非类型

5 个答案:

答案 0 :(得分:67)

protocol A : class { ... }

定义"class-only protocol":只有类类型(而不是结构或枚举)才能采用此协议。

仅为引用类型定义弱引用。类 引用类型,结构和枚举是值类型。 (闭包也是引用类型,但闭包不能采用 一个协议,所以它们在这种情况下是无关紧要的。)

因此,如果符合协议的对象需要存储在弱属性中,则协议必须是仅类协议。

这是另一个需要仅类协议的示例:

protocol A { 
    var name : String { get set }
}

func foo(a : A) {
    a.name = "bar" // error: cannot assign to property: 'a' is a 'let' constant
}

这不会编译,因为对于结构和枚举的实例,a.name = "bar"a的变异。如果你定义 协议为

protocol A : class { 
    var name : String { get set }
}

然后编译器知道a是类类型的实例  a是对象存储的引用, 并a.name = "bar"修改引用的对象,但不修改a

通常,如果需要,您可以定义仅限类的协议 采用协议的类型是引用类型而不是值类型。

答案 1 :(得分:4)

如果您使用的是 Swift 4和更高版本

protocol A : AnyObject { ... }

答案 2 :(得分:0)

您可以使协议派生自任何类类型,例如NSObject或AnyObject。例如:

protocol TopNewsTableDelegate  : AnyObject{
  func topNewsTableDidLoadedStories()
}

答案 3 :(得分:0)

或者您可以这样输入

@objc protocol A { ... }

然后您可以创建弱的委托人引用

答案 4 :(得分:0)

协议CustomProtocolName:NSObjectProtocol {   .... }