Swift VS Objective-C

前言:
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 环境下,为引用类型提供引用计数这样的内存管理,它是不能被用来修饰值类型的,
上面代码的两种修正方法

  1. 在 protocol 前面加上 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值