用static 或者class修饰符,都是可以的。它们使用后的效果是一样的,但是本质上是不同的。能解释一下为什么不同吗?
答案:
static修饰的属性或者修饰的函数都不可以重写。但是使用class修饰符,你可以重写属性或者函数。
当static在类中应用的时候,static就成为class final的一个别名。
例如,在下面的代码中,当你尝试重写illuminate()函数时,编译器就会报错:
class Star {
class func spin() {}
static func illuminate() {}
}
class Sun : Star {
override class func spin() {
super.spin()
}
override static func illuminate() { // error: class method overrides a 'final' class method
super.illuminate()
}
}
问题5- Swift 1.0 or later
你能通过extension(扩展)保存一个属性吗?请解释一下原因。
答案:不能。扩展可以给当前的类型添加新的行为,但是不能改变本身的类型或者本身的接口。如果你添加一个新的可存储的属性,你需要额外的内存来存储新的值。扩展并不能实现这样的任务。
高级
问题1- Swift 1.2
在Swift1.2版本中,你能解释一下用泛型来声明枚举的问题吗?拿下面代码中Either枚举来举例说明吧,它有两个泛型类型的参数T和V,参数T在关联值类型为left情况下使用,参数V在关联值为rihgt情况下使用,代码如下:
enum Either{
case Left(T)
case Right(V)
}
提示:验证上面的条件,需要在Xcode工程里面,而不是在Playgroud中。同时注意,这个问题跟Swift1.2相关,所以Xcode的版本必须是6.4以上。
答案:上面的代码会出现编译错误:
unimplemented IR generation feature non-fixed multi-payload enum layout
问题是T的内存大小不能确定前期,因为它依赖于T类型本身,但enum情况下需要一个固定大小的有效载荷。
最常用的解决方法是讲泛类型用引用类型包装起来,通常称为box,代码如下:
class Box{
let value: T
init(_ value: T) {
self.value = value
}
}
enum Either{
case Left(Box)
case Right(Box)
}
这个问题在Swift1.0及之后的版本出现,但是Swift2.0的时候,被解决了。
问题2- Swift 1.0 or later
闭包是引用类型吗?
答案:闭包是引用类型。如果一个闭包被分配给一个变量,这个变量复制给另一个变量,那么他们引用的是同一个闭包,他们的捕捉列表也会被复制。
问题3- Swift 1.0 or later
UInt类型是用来存储无符号整型的。下面的代码实现了一个有符号整型转换的初始化方法:
init(_ value: Int)
然而,在下面的代码中,当你给一个负值的时候,它会产生一个编译时错误:
let myNegative = UInt(-1)
我们知道负数的内部结构是使用二进制补码的正数,在保持这个负数内存地址不变的情况下,如何把一个负整数转换成一个无符号的整数?
答案:使用下面的初始化方法:
UInt(bitPattern: Int)
问题4- Swift 1.0 or later
描述一种在Swift中出现循环引用的情况,并说明怎么解决。
答案:循环引用出现在当两个实例对象相互拥有强引用关系的时候,这会造成内存泄露,原因是这两个对像都不会被释放。只要一个对象被另一个对象强引用,那么该对象就不能被释放,由于强引用的存在,每个对象都会保持对方存在。
解决这个问题的方法是,用weak或者unowned引用代替其中一个的强引用,来打破循环引用。
问题5- Swift 2.0 or later
Swift2.0 增加了一个新的关键字来实现递归枚举。下面的例子是一个枚举类型,它在Node条件下有两个相关联的值类型T和List:
enum List{
case Node(T, List)
}
什么关键字可以实现递归枚举?
答案:indirect 关键值可以允许递归枚举,代码如下:
enum List{
indirect case Cons(T, List)
}
Where To Go From Here?
恭喜你到了文章的最后,如果你不知道所有问题的答案,也不要感到沮丧。
因为上面中得有些问题还是比较复杂的,并且Swift是一门富有表现力的语言,还有很多需要我们学。此外,苹果公司一直改善Swift的新特性,所以即使学的最好的人也不可能知道所有的一切。
在你现有的Swift基础知识之上,要深入了解Swift ,你就的看看Swift by Tutorials这本书,或者加入我们实践教学协会RWDevCon。
当然,关于Swift所有方面的资源都来是苹果公司官方文档The Swift Programming Language。
事实上,学习一门语言最好的方式是用它。在你的工程里或者Plaugroud里面使用Swift编程。Swift几乎可以无缝衔接Object-C,所以在你现有的工程中使用Swift是一个学习Swift的很好的方法。
谢谢你的访问和回答这些问题。在下面你可以随意提问交流。我也不介意你在下面贴上自己遇见的难题和挑战,我们可以相互学习。论坛上再见!
文章转载自:http://www.pythonheidong.com/blog/article/