考虑这两个声明:

let a: any Protocol 

let a: Protocol

有什么不同吗?

推荐答案

这就是所谓的"existential any".

当你使用协议类型作为变量或函数返回类型等的类型时,该类型是存在类型.与具体类型(例如类, struct )相比,存在类型有更多的限制和性能影响.下面是Swift Evolution提案中的一个例子,说明了两者的区别.

protocol P {
  associatedtype A
  func test(a: A)
}

func generic<ConcreteP: P>(p: ConcreteP, value: ConcreteP.A) {
  p.test(a: value)
}

func useExistential(p: P) {
  generic(p: p, value: ???) // what type of value would P.A be??
}

在引入any之前,您可以用相同的方式编写存在类型和具体类型--只需编写它们的名称.这使得什么是存在主义类型,什么不是存在主义类型变得不是很清楚.因为存在主义类型的行为非常不同,所以明确地告诉读者"这是一个存在主义类型"是有用的.这就是any的用处.

另请参阅Motivation部分.

从Swift 6开始,所有存在类型都必须使用any前缀.

在SWIFT 5中,您仍然可以编写没有相关类型/Self要求的协议类型,而不需要any.另请参阅Source Compatibility部分.

为了最大限度地减少将在SWIFT 6中失效的新编写的代码量,我建议立即为具有自身和相关类型要求的协议要求任何代码.

这就是为什么Pany P都是有效的.它们的意思是一样的存在主义类型any P.但是在Swift 6中,在这里写P是无效的.

Swift相关问答推荐

SWIFT异步/等待,多个监听程序

如何在枚举有关联数据时使用combined if with case

SWIFT`String.Encoding`:`.unicode`vs`.utf16`

如何绑定环境变量ios17

在扩展中创建通用排序函数

如何让默认函数参数引用另一个函数参数?

如何延迟 swift 属性 didSet 使其每秒只触发一次

如何为等待函数调用添加超时

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

RxSwift 事件触发了两次

Reality Composer Tap Trigger 问题

如何处理永远不会失败的 String.Encoding 初始化程序?

更改该函数的参数之一时,如何将这些 SwiftUI 异步任务合并到一个任务中以从函数中获得正确的结果

判断 Swift 程序是否正在输出到终端

Swift 4 Decodable - 以枚举为键的字典

如何在 GCD 中停止 DispatchWorkItem?

swift - 我可以从我的自定义初始化方法中调用 struct 默认成员初始化吗?

Objective-C 方法与可选需求方法 Swift 冲突

Switch 语句中的字符串:String不符合协议IntervalType

ld:入口点(_main)未定义.对于架构 x86_64:Xcode 9