通常,在讨论像some这样的事情时,它们指的是返回类型。这个问题特别涉及在参数列表中使用any或some。
例如,在String的Swift文档中,您有这个初始化器.
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false)
where T : BinaryInteger在SWIFT5.6中,他们引入了any关键字,让我们更容易地处理存在类型。有了这个变化,我知道你理论上可以重写上面的内容。
init(_ value: any BinaryInteger, radix: Int = 10, uppercase: Bool = false)当然,也有基于some关键字的这个版本,它也能工作.
init(_ value: some BinaryInteger, radix: Int = 10, uppercase: Bool = false)我的问题是..。哪一个最有意义?在这样的泛型上使用存在类型有什么坏处吗?some版本呢?我最初认为是的,通用版本是最好的,因为编译器可以在编译时确定传递给它的是什么,但是同样地,存在的any,甚至some版本也是如此,因为如果您不通过BinaryInteger,它就不会编译--我不太确定如何编写测试来检查它。
发布于 2022-08-14 19:00:35
在Swift中将协议类型P的值传递给方法时,您目前可以使用4种可能的拼写:
func f<T: P>(_ value: T) (“通用”)func f(_ value: some P) (“不透明参数”)func f(_ value: P) (“裸”存在主义)func f(_ value: any P) (“显式”存在主义)在这些拼写中,(1)和(2)是同义词,目前(3)和(4)是同义词。在使用(1)和(2)之间没有差别,在(3)和(4)之间目前没有*没有差别;但是在(1)/(2)和(3)/(4)之间,有区别。
f<T: P>(_: T)是一种传统的接受具体类型T参数的方法,保证符合P协议。获取参数的这种方式:T,这样就可以对T本身执行操作。T类型,编译器知道值的大小和布局,可以适当地设置堆栈/寄存器;它可以将任何给定的参数直接传递给方法。Self-或associatedtype需求的协议类型调用。some Protocol的方法的版本完全等同于带有尖括号的泛型版本。我将避免重复提案的内容,但是导言部分详细说明了使用这种语法来简化拼写一般参数的复杂性的愿望。f(_: P)是一种传统的接受存在类型参数的方法,它保证符合协议P。获取参数的这种方式:type(of:)动态访问。P接口,可以动态地将方法传递到底层的具体值。这两种方法都需要在运行时分配一个额外的" box“,以便在一致大小和布局的容器内保存实际值,以及在对方框上的方法调用必须动态地分派到基础类型时,间接的成本。Self-或associatedtype需求的协议类型调用。any关键字是一个标记,它有助于指示该类型被用作存在主义。现在的与使用协议的裸名(即any P == P)完全相同,但是对于最终使用协议的裸名来代替some P,已经有了一些讨论。因此,为了说明您的具体示例:
init(_ value: some BinaryInteger, radix: Int = 10, uppercase: Bool = false)与原来的
init<T>(_ value: T, radix: Int = 10, uppercase: Bool = false)
where T : BinaryInteger而
init(_ value: any BinaryInteger, radix: Int = 10, uppercase: Bool = false)不是。而且,由于BinaryInteger有associatedtype需求,所以您也不能使用any版本,因为存在类型无法提供对底层关联类型的访问。(如果你试一试,你会得到经典的error: protocol 'BinaryInteger' can only be used as a generic constraint because it has Self or associated type requirements)
一般说来,泛型在可能的情况下比存在类型更可取,因为缺乏开销和更大的灵活性;但是,它们需要知道其参数的静态类型,这并不总是可能的。
现有要素更多地接受输入,但在功能上明显受到更大的限制,而且需要付出代价。
在偏爱<T: P>和some P之间,还是在P和any P之间--目前的选择是主观的,但是:
any关键字来表示存在的协议使用;使用该关键字的对应项是some,因此如果您希望开始对代码进行验证并保持一致,那么开始迁移到any和some可能是个好主意。https://stackoverflow.com/questions/73353394
复制相似问题