关于swift generics 一章

想到这个问题,来源于阅读苹果官方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时强行指定了他们所属的类,这样他们在编译的时候就被当作为一个类型,当然就可以被我们的范型交换函数交换了

你可能感兴趣的:(关于swift generics 一章)