Swift -- protocol 'weak' cannot be applied to non-class type报错

protocol的两种形式:

1,protocol A  {  }

2,protocol A : class {  }

首先说 protocol A : class {  } 这种形式被称为class-only protocol,只有类(不包括结构体、枚举)能遵循该协议。

弱引用只用在引用类型中。类(class)是引用类型,结构体和枚举是值类型。闭包也是引用类型,但是闭包不能遵循协议,所以他们于此无关。

另外,如果一个遵循协议的对象需要用到弱引用属性来存储,该协议必须是一个class-only协议。

这里有一个需要用到class-only的例子:

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 。

所以通常的,如果你需要一个类型遵循协议来当做引用类型而不是值类型,你将会用class-only protocol。

参考文章

你可能感兴趣的:(文章翻译,移动开发)