protocol myProtocol {}
func doSomething(with params: (some myProtocol)...) {
// Implementation goes here
}
extension Int: myProtocol {}
doSomething(with: 1, 2, 3)
func 声明行出现编译错误:
“某些”类型仅允许在属性、下标和函数中使用
我可以简单地完全省略关键字,但默认情况下它被认为是“any”。因此,我无法将参数传递给需要[some SyntaxProtocol]
作为参数的函数。
使用泛型可以获得相同的结果,
some
并且只允许一种符合协议的特定类型为什么不能
some
在可变参数中使用禁止在可变参数中使用不透明类型(
some Protocol
)是语言开发人员有意识的决定。因为它会与另一个提议的语言功能冲突,称为variadic generics
:来源:https://github.com/apple/swift-evolution/blob/main/proposals/0341-opaque-parameters.md#variadic-generics
所以,这不是错误,也不是疏忽。它正在按预期工作。
参数类型声明中该关键字的含义
some
到底是什么?但是你应该如何处理你的代码呢?好吧,我们首先要检查一下为什么要添加该语言功能,以及它“在幕后”做了什么:
引入它是为了使大量使用泛型的函数变得“更轻”并且更易于阅读。
将代码转为:
进入这个:
这两个片段是等效的,
some View
编译期间的版本只是变成通用函数版本。资料来源:https ://github.com/apple/swift-evolution/blob/main/proposals/0341-opaque-parameters.md#propose-solution
你该怎么办
正如之前所说:这种语法糖对于可变参数显然不可用。因此,唯一明显的解决方案是退回到“无糖”语法并使用通用参数:
它会按预期工作(如果您希望变量列表中的所有参数都应具有完全相同的类型,则确认
myProtocol
, ofc )。