本文介绍了SWIFT协议错误:'弱'不能应用于非类类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

协议和类绑定协议有什么区别,我们应该在SWIFT中使用哪种协议?

protocol A : class { ... }

protocol A { ... }

当协议未定义为: class时,尝试添加weak委托时出错:

protocol A { ... }

weak var delegate: A

给出错误:

推荐答案

SWIFT&>=4:

protocol A : AnyObject { ... {

SWIFT<;4:

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

因此,通常情况下,如果需要,您可以定义仅类协议采用协议的类型为引用类型,不是值类型。

这篇关于SWIFT协议错误:&#39;弱&#39;不能应用于非类类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 06:50