swift协议&x27;弱';不能应用于非类类型

swift协议&x27;弱';不能应用于非类类型,swift,protocols,Swift,Protocols,我有点困惑。协议A:class{…}和协议A{…}之间有什么区别,我们应该在swift中使用哪一个 PS:我们这样写的时候出错了 protocol A{ ... } weak var delegate: A 错误:“弱”不能应用于非类类型 protocol A : class { ... } 定义:只有类类型(而不是结构或枚举)可以采用此协议 弱引用仅为引用类型定义。班级 是引用类型,结构和枚举是值类型。 (闭包也是引用类型,但闭包不能采用 协议,因此在这种情况下它们是不相关的。) 因此,

我有点困惑。
协议A:class{…}
协议A{…}
之间有什么区别,我们应该在swift中使用哪一个

PS:我们这样写的时候出错了

protocol A{ ... }

weak var delegate: A
错误:“弱”不能应用于非类类型

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

因此,一般来说,如果需要,可以定义一个仅类的协议
采用协议的类型是引用类型而不是值类型。

您可以使协议派生自任何类类型,如NSObject或AnyObject:

protocol TopNewsTableDelegate : AnyObject {
    func topNewsTableDidLoadedStories()
}

或者你可以这样打字

@objc protocol A { ... }

如果您使用的是Swift 4及更高版本

protocol CustomProtocolName : NSObjectProtocol {
  // ...
}
protocol A : AnyObject { ... }

在您的代码示例中,您说a是一个let常量。我有点困惑。是什么使
a
在这里成为常数?@Suragch:Function参数–如
func-foo(a:a)
中的
a
–默认为常数。“因此,如果您的协议定义了弱属性”-协议不定义
属性(仅
获取
获取集
);它不应该这样写:“因此,如果符合协议的对象需要存储在弱属性中…”?