我发现这段代码不会产生错误

protocol Foo{
    func foo()
}

let x: Foo? = nil

当下面的人开始抱怨Use of protocol 'Foo' as a type must be written 'any Foo'

protocol Foo: ObservableObject{
    func foo()
}

let x: Foo? = nil      //Use of protocol 'Foo' as a type must be written 'any Foo'

因为ObservableObject继承了AnyObject,所以我试了

protocol Foo: AnyObject{
    func foo()
}

let x: Foo? = nil

这也不会给出错误.

使用协议作为类型时需要写入any的具体情况是什么?

推荐答案

根据推出any-SE-0335的提案,

对于所有协议,SE-0309 Unlock existentials允许使用存在类型编写更多代码.为了最大限度地减少将在SWIFT 6中失效的新编写的代码量,我建议立即为具有Self和相关类型要求的协议要求任何代码.这为SWIFT 5语言模式下的协议带来了不一致,但这种不一致在今天已经存在(因为您根本不能将某些协议用作存在类型)

因此,从SWIFT 5.6开始,编写"具有Self和相关类型要求的协议"的存在类型是必需的.ObservableObject是这样的协议,具有与ObjectWillChangePublisher相关联的类型.

请注意,在SWIFT 6及更高版本中,或在SWIFT 6语言模式中,所有协议的存在类型都需要any.

Swift相关问答推荐

动画过程中的SwiftUI重绘视图

如何在自定义视图中读取修改符子元素?

在SwiftUI中判断选项时避免重复查看

如何在SWIFT任务中判断当前任务是否已取消(异步/等待)

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

SwiftUI-如何使用剩余时间制作倒计时计时器

Swift String.firstIndex(of: "\n") 返回 nil,即使字符串有 \n

如何在 Swift 中做类型安全的索引?

如何使一个 Reality Composer 场景中的分组对象可拖动?

从 actor 的 init 方法调用方法

使用 RxSwift 围绕 async/await 方法创建 Observable

如何在 SWIFTUI 中旋转修剪?

当使用 CGFloat 而不是数字文字时,为什么 node 的位置会发生变化?

如何更改任务栏 colored颜色 和 sf 符号 colored颜色 ?

Swift 读写图片占用大量内存

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

Xcode 7.3 Swift 的语法高亮和代码完成问题

如何从 UITableViewCell 类中引用 UITableViewController?

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

Swift UITableView reloadData 在一个闭包中