swift protocol 'weak' cannot be applied to non-class type

六月ゝ 毕业季﹏ 提交于 2019-12-28 05:35:42

问题


I'm a bit confused. What's the difference between protocol A : class { ... } and protocol A{ ... }, and which one we should use in swift?

PS: we got an error when we wrote like this

protocol A{ ... }

weak var delegate: A

error : 'weak' cannot be applied to non-class type


回答1:


protocol A : class { ... }

defines a "class-only protocol": Only class types (and not structures or enumerations) can adopt this protocol.

Weak references are only defined for reference types. Classes are reference types, structures and enumerations are value types. (Closures are reference types as well, but closures cannot adopt a protocol, so they are irrelevant in this context.)

Therefore, if the object conforming to the protocol needs to be stored in a weak property then the protocol must be a class-only protocol.

Here is another example which requires a 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
}

This does not compile because for instances of structures and enumerations, a.name = "bar" is a mutation of a. If you define the protocol as

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

then the compiler knows that a is an instance of a class type to that a is a reference to the object storage, and a.name = "bar" modifies the referenced object, but not a.

So generally, you would define a class-only protocol if you need the types adopting the protocol to be reference types and not value types.




回答2:


You can make the protocol derive from any class type like NSObject, or AnyObject. e.g :

protocol TopNewsTableDelegate  : AnyObject{
  func topNewsTableDidLoadedStories()
}



回答3:


Or you can type like this

@objc protocol A { ... }

then you can make a weak delegate reference




回答4:


protocol CustomProtocolName : NSObjectProtocol{ .... }



来源:https://stackoverflow.com/questions/33471858/swift-protocol-weak-cannot-be-applied-to-non-class-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!