前言:
Swift 注重安全性,而Objective-C注重灵活性,Swift有函数式编程,面向对象编程,和面向协议编程,而Objective-C 几乎只有面向对象编程,Swift更注重值类型的数据结构,而Objective-C 遵循c语言的老一套,注重指针和索引,Swift 是静态类型语言,而Objective-C 是动态类型语言
数据结构
Swift 为什么将String Array 和 Dictionary 设计成值类型
要解答这个问题,就要和Objective-C中相同的数据结构设计进行比较。Objective-C中,字符串,数组,字典,皆被设计为引用类型。
- 值类型比引用类型,最大的优势在于高效使用内存,值类型在栈上操作,引用类型在堆上操作,栈的操作仅仅是指针的上下移动,而堆的操作牵扯到,移位,合并,重新连接等。也就是说swift 这样设计大大的减少了堆上内存分配和回收次数。
- Swift 将 String Array 和 Dictionary 这样设计 成值类型也是为了线程安全,通过 Swift的 Let 的设计,可以使得数据达到真正意义上的不变,从而根本解决了多线程中内存访问和操作数据的问题。
- Swift 将 String Array 和 Dictionary 设计成值类型还可以提高API的灵活性,例如可以通过Collection 这样的协议,可以遍历 String 使得整个开发更加灵活,高效
用Swift 将协议(protocol)中的部分方法设计成可选(optional),该怎样实现?
@optional和@required是Objective-C中特有的关键字。
在swift 中默认所有方法在协议中都是必须要实现的,而且在协议中方法不可以被直接定义为optional 下面给出两种解决方按
- 在协议和方法前都加上@objc 关键字,然后在方法前加上optional ,改方法实际上是把协议转化为Objective-C 方式,然后进行可选定义
* @objc protocol SomeProtocol {
* func requiredFunc()
* @objc optional func optionalFunc()
* }
- 用扩展(extension)来规定可选方法,在swift 中协议的扩展(protocol extension)可定义部分方法的默认实现,这样这些方法在实际调用中就是可选实现的了,
* protocol SomeProtocol {
* func requiredFunc()
* func optionalFunc()
* }
*
* extension SomeProtocol {
* func optionalFunc() {
* print(“Dumb Implementation”)
* }
* }
*
* Class SomeClass: SomeProtocol {
* func requiredFunc() {
* print(“Only need to implement the required”)
* }
* }
协议代码实战
下面的代码有什么问题?
protocol SomeProtocolDelegate {
func doSomething()
}
class SomeClss {
weak var delegate: SomeProtocolDelegate?
}
在上面的代码中,倒数第二行代码(SomeClass的delegate那一行)会报错
Swift 中的协议不仅可以被class 这样的引用类型实现,也可以被struct 或者 enum 这样的值类型实现(这就是和Objective-C)的最大不同,weak 关键词用于ARC 环境下,为引用类型提供引用计数这样的内存管理,它是不能被用来修饰值类型的,
上面代码的两种修正方法
- 在 protocol 前面加上