改用swift来思考

改用swift来思考

幸存代码库 + 你的脑力 + Swift。 怎么会磨呢?

原稿链接: Switching Your Brain to
Swift

  • 原文日期: 2015/08/17
  • 译文日期: 2015/09/04
  • 译者:ray16897188

正文原基于360iDev
2015的同一次说。等发视频后我会贴上连。与此同时,何不看看自家于elsewhere高达另的Swift文章,以及我Twitter的主页呢?

完美的图景当是由零散从头的一个100%
Swift的类。如果您可知这么做,很硬!但针对与我们受到的那些手里已经产生现成代码库,而且有一定量想试Swift的人来说,我们会于乌开始?

为什么?

跌落一步:你干什么想就此Swift去描绘代码呢?很多缘由:Swift是最新;Swift有再度好之语法(开始口水战了);Swift是Apple指引给我们的初取向。

明天,Swift的绝无仅有程度还见面连续添,并会见化民众首选之,有最完美之技术支持的,写OSX和iOS代码最便利的相同种语言。

图片 1

Swift是未来的路,就这样理解了。那怎么开才能够起用Swift的措施去思辨也?

Swift的方式

产生无限多设考虑的作业了,但我们由零星只大之方说自:安全性及值语义(value
semantics)。

安全性

Objective-C里的Nil棒极了。你得给好东西一直发消息,
好似明天凡是世界末日,运行时就见面一直提供对。

唯独Swift中之Nil却是另外一个颇不同之精。通常来讲类型系统(type
system)会管你于拟调用空函数或者看空属性中挽救出来,阻止你这样干。但您能绕了类型系统,而如此做同当C语言中解引用一个空指针一样糟糕:在运转时您晤面吃修好的破获,然后您的app会崩溃。

Swift中尽还涉及类型安全。一个String是一个String,那她就是是一个String。此时从不怕无nil什么事儿。多想想C++中之援而无C中的指针,因为引用永远也非会见是nil。

然选类型

来了但选类型,nil就又回到了。一个可选类型的String可以真正是一个String,或者是nil。你不能不开检查,每一样蹩脚还如。

要未做检查:你可以强制将这个可选类型变量拆包。或者用她换成一个隐式解析只是选类型(implicitly
unwrapped
optional),这象征它们有些复杂的劣势,但可当非可选类型一样去动 –
直到其是nil的时段,app就夭折了。

图片 2

(所有的都拆包!)

Cocoa里发生尽多而选类型,这代表你各个用其中一个,就得错过反省中是呀。

立即是一个坏的琢磨转变。其中的思路是:你不应该留别样偶然因素为发送的音吧nil。你该明了,一个强类型系统受,某种东西还是是nil,要么就来价。

一经当运行时有不确定性,就开检讨。不要强制去拆包。

将可选类型想成是一个盒子:这个盒子要么没价值(nil),要么就算生出价。但是你在要挟拆包它之前总要事先夺检查一下。

图片 3

(你得问:可选类型的盒子内是何?)

再有很多其它展示Swift安全性的例子:构造器,更少量底未定义行为(less
undefined behavior),内存安全。Nil的安全性是究竟会并发的同种。

值类型

值类型在Swift中随处可见。没什么新物 –
Objective-C就生像NSInteger和相近CGRect的结构体这样的基元(primitives)。但那大部分

  • NSString,NSArray等等 – 都是相近(classes),因此是引用类型。

Swift中尽管统统相反,如果你扫一眼头文件的言语会发现标准库中产生80大抵独结构体,只发4独八九不离十。

String,numbers和集纳类型在Swift中都是值类型。这意味一旦你发一个可变的Swift
String(是结构体)并将其污染于一个函数,你获取的是一个拷贝(copy)。重复相同一体,这决不一个吓人的新定义:我们当Objective-C中就做了老大长远之copy和mutableCopy。这里充分的变化是对大部分宽广类型来说这是新的缺省行为。

倒霉的凡,如果您于Swift中因故结构体写了来生硬的代码,在Objective-C中公是不可知回访它们的。这就算把咱带来及了生一个话题:桥接。

桥接

Swift理所当然的于设计改为了会与Objective-C良好协同工作。这基本上是一个必需之,无需争论的真情,因为Cocoa是也Objective-C而建立。所有这些Cocoa的API必须能够打Swift调用,这象征你自己之Objective-C的好像为可以好的桥接到Swift中。

发出只问题:从Swift开始,加入Objective-C代码,然后想当Objective-C中调用你的Swift代码。

从Swift到Objective-C

出无限多的Swift特性完全不可知桥接到Objective-C里,比如Swift自己之结构体和提高的枚举类型。这代表要你用Swift里所有最可怜的风味写出来的新式最好强之framework,其中大部分并无可知给Objective-C访问到。

就你给好开限定,仅用Swift中那些可兼容Objective-C的表征去形容,你啊非能够打Objective-C的类派生起一个用Swift写的子类。你可遵循table
View或collection view的模式,并据此delegate和布局对象(layout
objects)来规避之问题,但是要你的API是如果受持续从而派生子类的口舌,还是如时刻牢记这或多或少。

Swift中其他事物在Objective-C中还默认不可见。
如您管你的class和protocol标记了@objc,那它们就好以Objective-C中之所以了。动态调节器(dynamic
modifier)也暗含着@objc的标号,让叫标记的东西在Objective-C中可用,但它们而那些吃标记了dynamic的性能或者措施以的是Objective-C的动态分发(dynamic
dispatch)。

图片 4

(Swift&Objective-C)

只要您想就此swizzle之类的东西,你就是用为此dynamic;仅仅让她标识@objc还不足以保证objc_msgSend()能吃运,因为方法是生或给失去虚拟化(devirtualized)或者受内联了。

更一下,这只针对那些可配合的特色使得。你自己写的Swift枚举类型受到的艺术并无适用。如果您枚举类型不是出于Int型所构建,那便配合不了。

Objective-C 到 Swift: 可空性(Nullability)

起Objective-C转至Swift有诸多好信息。为了推动这转换过程,在Objective-C中您要是叫您的特性,参数和归值类型加上标注(annotation)。

  • _Null_unspecified (default) –
    桥接到一个Swift隐式解析只是选类型(implicitly-unwrapped optional)。
  • _Nonnull – 该值不可以是nil;桥接到一个常规的援。
  • _Nullable – 该值可以是nil;桥接到一个可选类型。

假若你吃你的Objective-C加了标,你尽管会见顺畅的拿项目桥接到Swift中。即使你无接触了Swift,你用Objective-C的当儿这些号为会见于代码补全后面世。如果您告诉编译器一个智的参数是_Nonnull的,然后传进一个nil,你不怕见面落一个理所当然之编译器警告。

开始也代码加标注是很好的做法。使用现有的API的早晚标注会帮到公,你开用Swift的当儿吗会为您加快速度。

Objective-C 到 Swift: 轻量泛型(Lightweight Generics)

轻量泛型是Swift
2的新特性。集合类型NSArray,NSDictionary(对值类型)和NSSet可以分包其他旧的NSObject类型。

当下象征大量之类型转换(casting)。Objective-C中莫是问题,但是切记:Swift是涉安全性的。正确的变涉及到大方底反省。你无应当强制的做类型转换,而应先测试。

今时有发生矣泛型,意味着你可当Objective-C中这样描写:

NSArray<NSString *> * _Nonnull

立马是一个碰头包含NSString对象的NSArray。有了可空(nullability)的注解,你可知见其还说了这array不见面吗nil,你总会得到一个array。如果您了解Java或者C++就会熟悉此地的泛型语法。
下一场桥接到Swift就会见是这样:

[String]

一个百般明晰的Swift String数组。
有些的补充说明:轻量泛型只能采取叫基本集合类:arrays,dictionaries和sets。

每当浑水上架桥

我会建议从零开始新建一个Swift的档次 –
100%了的Swift。如果你生第三正在的frameworks,它们是Swift写的尚是Objective-C写的即使无见面发出太多影响

  • 君能够调用内的其余一样栽。
    假如你生出一个共处的代码库,而且若想要起引入Swift:那就尝试用桥接按照从Objective-C到Swift的自由化拓展。比如view
    controllers和views的现实性实例在Swift中即使运行的万分好;它们继承自NSObject,如果需要的话你是得由Object-C中访问到它们的。

图片 5

(金门大桥)

然本着负有其他的吧:纯Swift泛型,由非整型,嵌套类型,结构体构成的枚举类型等等

  • 不怕待等到你身处于一个100%
    Swift世界中的那么同样龙了。别给拿走下,这同上会比你想象的来之更早。

在那天之前,接着写能友善兼容Swift的Objective-C的代码并保障对Swift最新技术的咀嚼吧。有无限多之资源会帮忙您完了联网。

资源

  • What’s New in Swift
    2
    – 跟达到Swift 2的行特性
  • Swift Guard
    Statement
    – 有人提问了一个关于让代码保持”happy
    path(没有异常要错误代码,保证一切还照所要的情状运转 –
    译者注)”的题材,Swift 2中的guard语句就能够帮您兑现就点!
  • Introducing Protocol-Oriented Programming in Swift
    2
    – 面向协议的编程(Protocol-oriented
    programming)是现阶段Swift的初热点。
  • Using Swift with Cocoa and Objective-C (Swift 2
    Prerelease)
    – Apple关于Swift + Objective-C + Cocoa的教程