想到这个问题,来源于阅读苹果官方swfit4.1文档中The Problem That Generics Solve一节的note:
In all three functions, the types of a and b must be the same. If a and b aren’t of the same type, it isn’t possible to swap their values. Swift is a type-safe language, and doesn’t allow (for example) a variable of type String and a variable of type Double to swap values with each other. Attempting to do so results in a compile-time error.
这句话的大概意思是swift是强类型的语言,并不允许两个不同类型的变量(如String和Double)进行交换,如果尝试这种行为会导致编译时错误。
当时阅读到这一段的时候,突然发现在swift里面实现两个不同类型的变量进行交换是存在可能的,得益于swift强大的语言功能我们可以做出如下实现:
protocol HelpProtocol{}
class A{}
class B{}
extension A:HelpProtocol{}
extension B:HelpProtocol{}
func swapTest(a:inoutT, b:inoutT) {
lettemp = a;
a = b;
b = temp
}
var a:HelpProtocol = A()
var b:HelpProtocol = B()
swap(&a, &b)
通过以上代码我们就实现了A和B两个不通类型的数据交换。如果把A换成String,B换成Double,就完成了note里面所说的会导致编译时错误的操作。
当然代码虽然少,但是里面已经涉及到了swift里面比较基础的一些核心概念,比如protocol可以当作类型来处理,这样其实就相当于可以通过extension把一些不同类型的数据变为一个类型,由于swift具有引用推断,所以在创建A,B时强行指定了他们所属的类,这样他们在编译的时候就被当作为一个类型,当然就可以被我们的范型交换函数交换了
网友评论