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。

参考文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值