加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift在实际项目中的应用

发布时间:2020-12-14 01:34:52 所属栏目:百科 来源:网络整理
导读:Swift的应用 与Cocoa交互 要用Swift写App首先需要了解的就是UI怎么写、系统功能怎么调用。由于Swift并没有重写系统功能库,只是对Cocoa进行了桥接,所以要调用系统功能就要与Cocoa的交互。Swift与Cocoa交互的细节非常多,但是并没有太大难度,因为Cocoa的使

Swift的应用

与Cocoa交互

要用Swift写App首先需要了解的就是UI怎么写、系统功能怎么调用。由于Swift并没有重写系统功能库,只是对Cocoa进行了桥接,所以要调用系统功能就要与Cocoa的交互。Swift与Cocoa交互的细节非常多,但是并没有太大难度,因为Cocoa的使用与用Objective-C开发时没有太大不同,一般来说跟着Xcode的提示走基本都没有问题。需要注意的几点:


  1. Swift没有发消息这种方式,所有方法调用和属性访问都是用点操作,alloc、init桥接成了swift中的构造器,使用时直接用class实例化的方式即可。
  2. 一些常用类型在swift中都有对应,可以相互转换,通常情况建议使用swift的类型。
  3. Object-C中有些机制比如 KVO等在swift中不支持,如果要使用,需要带上@objc、dynamic等标记。


多线程

Swift语言本身并没有多线程支持,因此要使用多线程还是要调用NSThread、GCD等:


此外,Object-C中一个很方便的代码互斥方式@synchronized在swift中不支持,因此要实现代码互斥需要自己使用锁。当然也可以模仿@synchronized自定义一个synchronized方法,利用尾部闭包造出原来的感觉:


单例

单例模式是移动开发中常见的一种模式,其一般要求是:

  1. 只初始化一次;
  2. 线程安全;

在Object-C中单例通常是用dispatch_once来实现的,在Swift中同样可以这么做。但是由于Swift中支持全局变量、常量的lazy初始化,我们可以简化单例的实现:

通过let定义单例实例常量来保证线程安全,通过全局常量的lazy初始化来保证单例只初始化一次。

ARC

Swift中的ARC原理与Object-C中一样,只不过在使用形式上有所不同。Swift中所有引用默认都是强引用,另外加入了两个ARC标记:

  • weak:类似Object-C的weak,弱引用,引用失效后引用自动赋值为nil;
  • unowned:类似Object-C中的unsafe_unretain,弱引用,引用失效后保留引用本身;

由于weak引用在使用过程中可能变为nil,所以weak引用必须是可选类型(Optional)。另外Swift对闭包捕获的变量的标记做了优化:


在Object-C中这种情况需要在闭包之外定义一个weakself,然后闭包捕获weak self。Swift中只需要把weak self写在闭包参数表之前的中括号中即可完成同样功能,这种方式代码结构更清晰,可读性更好。需要注意的是在闭包内self是weak的,是个可选类型,因此使用self时需要解可选。

Delegate

代理模式是开发中很常见的一种模式,它的实现原理与Object-C类似,也是通过协议来确定代理接口,用实现协议的实例来充当代理:


不同的地方在于,Object-C中delegate是id类型的,而swift中协议是一种基本类型,delegate可以直接定义为协议类型,这样能让代理的职责更明确。要注意的地方是delegate是weak的,所以必须使用可选类型,而且weak标记的必须是引用,所以protocol必须打上class标记,表示该协议只能被class实现,这样协议类型才能当做引用类型使用。

自定义操作符

Swift中可以自定义操作符,自定义一个操作符需要两个要素:

  1. 操作符特性描述,包括:操作符位置 prefix、infix、postfix等,操作符的结合性left、right以及操作符的优先级;
  2. 操作符功能函数,参数和返回值需要与操作符特性一致,比如 prefix的操作符接受一个参数,返回一个值;

比如我们可以定义一个笑脸操作符,他在字符串后面添加一个笑脸(^_^):


函数式编程

在Swift中,函数是first-class,也就是说函数可以作为参数传入也可以作为返回值返回,也可以给变量赋值。函数式编程是一种很强大、很灵活的思想,在Object-C中也有block等函数式编程思想,但并不明显,在Swift中这一点得到了强化。

比如说可以实现一个函数工厂:


泛型编程

Swift中增加了泛型这个概念,泛型是一种很好的代码复用机制,用于将类型不同但实现相同的代码统一起来。泛型在Swift中应用非常广泛,你只要跳转到Swift的库文件就会发现类型、操作符、全局函数的定义中大量应用了泛型,因此不再做详细介绍。这里有一个小例子,利用操作符自定义、函数式和泛型在代码中实现管道机制:


总结

Swift有着更严格的类型和更规范的语义,针对容易造成BUG的点进行了优化,又加入了很多不错的语法糖,代码更简洁、更安全。它吸收了大量其他语言的优秀特性,可以实现一些强大灵活的设计模式,但也造成了其语法繁杂的缺点,增加了学习的难度。Swift本身的设计目标是高效、灵巧,但由于需要兼容Cocoa,导致其设计受到牵制,引入了一些有隐患的设计。由于这些特点,编写Swift代码其实很依赖IDE的辅助,但目前为止xcode的表现还不稳定,经常提示错误,再加上几乎每次xcode更新都伴随着Swift语法修改,Swift想要广泛应用于实际工程还有一段路要走,而Swift2.0的发布和Swift开源化,无疑将加快这个进程。

参考书籍

  • The Swift Programming Language, Apple Inc.
  • Using Swift with Cocoa and Objective-C, Apple Inc.
  • Swifter - 100个Swift必备Tips,王巍

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读