gpt4 book ai didi

Swift 协议(protocol)错误 : 'weak' cannot be applied to non-class type

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:11 25 4
gpt4 key购买 nike

Protocols 和 class-bound Protocols 有什么区别,我们应该在 Swift 中使用哪一个?

protocol A : class { ... }

protocol A { ... }

当协议(protocol)未定义为 : class 时尝试添加 weak 委托(delegate)时出现错误:

protocol A { ... }

weak var delegate: A

给出错误:

'weak' cannot be applied to non-class type

'weak' must not be applied to non-class-bound 'A'; consider adding a protocol conformance that has a class bound

最佳答案

swift >= 4:

protocol A : AnyObject { ... {

swift <4:

protocol A : class { ... }

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

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

因此,如果符合协议(protocol)的对象需要存储在弱属性中,那么该协议(protocol)必须是类专用协议(protocol)。

这是另一个需要类协议(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)为

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

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

所以一般来说,如果需要,您会定义一个类专用协议(protocol)采用该协议(protocol)的类型是引用类型而不是值类型。

关于Swift 协议(protocol)错误 : 'weak' cannot be applied to non-class type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com