swift学习Swift学习: 从Objective-C到Swift

前端之家收集整理的这篇文章主要介绍了swift学习Swift学习: 从Objective-C到Swift前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

作者:@方秋枋GitHub
这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。

结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感。

文章组织脉络:

  • 从Objective-C到Swift的语法差异。我们熟悉的Objective-C特性在Swift中如何展现。

  • 从Objective-C到Swift的进步改进。研究对比Swift在安全性,易用性上的提升,给我们带来的新编程范式。

  • @H_404_21@

    目录:

    1.属性(property)和实例变量(instance variable)

    2.控制流

    3.函数

    4.类与初始化(Initializers)

    5.枚举与结构体

    6.协议(Protocols)

    7.Swift与Cocoa

    8.总结

    1.属性(property)和实例变量(instance variable)

    Objective-C property in Swift world

    在Cocoa世界开发的过程中,我们最常打交道的是property.

    典型的声明为:

    1
    @property(strong,nonatomic)NSString*string;

    而在Swift当中,摆脱了C的包袱后,变得更为精炼,我们只需直接在类中声明即可

    1
    2
    3
    classShape{
    var name= "shape"
    }

    注意到这里,我们不再需要@property指令,而在Objective-C中,我们可以指定property的attribute,例如strong,weak,readonly等。

    而在Swift的世界中,我们通过其他方式来声明这些property的性质。

    需要注意的几点:

    • strong: 在Swift中是默认的

    • weak: 通过weak关键词申明

    • @H_404_21@
      weakdelegate:UITextFieldDelegate?
      • readonly,readwrie 直接通过声明常量let,声明变量var的方式来指明

      • copy 通过@NSCopying指令声明。

      • @H_404_21@

        值得注意的是String,Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference type)出现,因此它们在赋值,初始化,参数传递中都是以拷贝的方式进行(简单来说,String,Array,Dictionary在Swift中是通过struct实现的)

        延伸阅读:Value and Reference Types

        • nonatomic,atomic 所有的Swift properties 都是nonatomic。但是我们在线程安全上已经有许多机制,例如NSLock,GCD相关API等。个人推测原因是苹果想把这一个本来就用的很少的特性去掉,线程安全方面交给平时我们用的更多的机制去处理。

        • @H_404_21@

          然后值得注意的是,在Objective-C中,我们可以跨过property直接与instance variable打交道,而在Swift是不可以的。

          例如:我们可以不需要将someString声明为property,直接使用即可。即使我们将otherString声明为property,我们也可以直接用_otherString来使用property背后的实例变量。

          3
          4
          @interfaceSomeClass:NSObject{
          NSString*someString;
          }
          @property(nonatomic,copy)NSString*otherString;

          而在Swift中,我们不能直接与instance variable打交道。也就是我们声明的方式简化为简单的一种,简单来说在Swift中,我们只与property打交道。

          A Swift property does not have a corresponding instance variable,and the backing store for a property is not accessed directly

          小结