Swift协议错误:“weak”不能应用于非类类型

0tdrvxhp  于 2023-03-07  发布在  Swift
关注(0)|答案(5)|浏览(125)

Protocols和类绑定Protocols之间有什么区别?我们应该在Swift中使用哪一种?

protocol A : class { ... }

protocol A { ... }

如果协议未定义为: class,则尝试添加weak委托时会出现错误:

protocol A { ... }

weak var delegate: A

给出错误:
"weak"不能应用于非类类型

"weak"不能应用于非类绑定的"A";考虑添加具有类界限的协议一致性

0yycz8jy

0yycz8jy1#

雨燕〉= 4:

protocol A : AnyObject { ... }

雨燕〈4:

protocol A : class { ... }

定义了“仅类协议”:只有类类型(而不是结构或枚举)可以采用此协议。
弱引用只为 * 引用类型 * 定义。类是引用类型,结构和枚举是值类型。(闭包也是引用类型,但是闭包不能采用协议,所以它们在这个上下文中是不相关的。)
因此,如果符合协议的对象需要存储在弱属性中,则该协议必须是仅类协议。
下面是另一个需要仅类协议的示例:

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
因此,一般来说,如果您需要采用协议的类型是引用类型而不是值类型,则可以定义一个仅类协议。

ws51t4hk

ws51t4hk2#

如果您使用的是Swift 4或更高版本,请使用AnyObject

protocol A : AnyObject { ... }

如前所述使用class会发出警告并进行修复:
不推荐使用“class”关键字定义类约束协议;请改用“AnyObject”
将“类”替换为“AnyObject”

vfwfrxfs

vfwfrxfs3#

您可以使协议从任何类类型(如NSObject或AnyObject)派生:

protocol TopNewsTableDelegate : AnyObject {
    func topNewsTableDidLoadedStories()
}
czfnxgou

czfnxgou4#

或者你可以这样打字

@objc protocol A { ... }

则可以创建弱委托引用

qnyhuwrf

qnyhuwrf5#

protocol CustomProtocolName : NSObjectProtocol {
  // ...
}

相关问题