美文网首页
认真认识Swift

认真认识Swift

作者: Fengur | 来源:发表于2017-01-04 15:32 被阅读86次

    1、诞生

    Apple-swift-logo.png

    Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序。在设计Swift时,官方就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言。
    Swift是供iOS和OS X应用编程的新编程语言,基于CObjective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式,并通过添加新鲜的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
    2010 年 7 月LLVM 编译器的原作者暨苹果开发者工具部门总监克里斯·拉特纳(Chris Lattner - Swift创始人)开始着手 Swift 编程语言的工作,还有一个 dogfooding 团队大力参与其中。至2014年6月发表,Swift大约历经4年的开发期。苹果宣称Swift的特点是:快速、现代、安全、互动,且全面优于Objective-C语言。Xcode Playgrounds功能是Swift为苹果开发工具带来的最大创新,该功能提供强大的互动效果,能让Swift源代码在撰写过程中能实时显示出其运行结果。拉特纳本人强调,Playgrounds很大程度是受到布雷特·维克多(Bret Victor)理念的启发。
    Go to check details

    2、发展历史

    2015年6月8日,苹果于WWDC2015上宣布,Swift将开放源代码,包括编译器和标准库。
    2015年12月3日,苹果宣布开源Swift,并支持Linux,苹果在新网站Swift.org和托管网站Github上开源了Swift,但苹果的app store并不支持开源的Swift,只支持苹果官方的swift版本,官方版本会在新网站Swift.org上定期与开源版本同步。

    3、特点

    • Swift取消了OC的指针及其他不安全访问的使用,并舍弃OC早期套用Smalltalk的语法,全面改为句点表示法(dot-notation)。同许多脚本语言一样,Swift可以推断变量类型(类型推导,var, variant)。同时,它提供了类似C++C#的命名空间(namespace)、泛型(generic)、运算对象重载(operator overloading)。Swift被简单的形容为 “没有COC”。

    • 类型与变量
      Cocoa( Mac OS X的开发环境 )与Cocoa Touch( iPhone OS的开发环境 )的环境下,许多共用的类都放在FoundationKit库下,这些类别包含了NSString 字符串库(使用 Unicode),还有集合类别 NSArrayNSDictionary。OC 提供了语法糖(syntactic sugar)的方式让这些对象可以集成在同一个语言里。例如NSString之间合并的表示法如下:

    NSString *str = @"what a,"; str = [str stringByAppendingString:@"nice day"];
    

    Swift里, 字符串的合并可以用加法(+)运算对象作为第一优先级对象(First-class citizen)的方式直接完成, 上述的例子可以简化为:

    var str = "what a,"
     str += " nice day"
    

    过去Cocoa(以及Cocoa Touch)的架构总是被分成两种版本:

    • 可变的(mutable),也就是可以在运行时期(runtime)改变
    • 不可变的(immutable),其初始值不可改变。
      例如 NSArray 与 NSMutableArray 就是数组的两种版本。

    Swift语言里仍延续这个传统,但更简化。

    • 使用let 关键字去设置常量constant variable
    • Mutable对象则使用 var 关键字

    Swift语言使用类似C#Javascriptvar定义变量,但特性又不尽相同:

    • Swift不会直接指派初始值给变量,即变量不会有默认值,所以使用var变量之前必须先初始化,不然会发生编译时期的错误。

    • 为了方便使用,Swift还提供Optional的定义来宣告nil-free references。宣告Optional只需要在类型后面加上问号(?)即可。一旦var变量宣告为Optional的,其初始值就会被默认为nil。Optional本质上是enum,有定义NoneSome两种类型,nil即是Optional.None

    • 库、运行时期与部署
      SwiftMac OSiOS 平台可以和 Objective-C 使用相同的运行时期(runtime)。这意味着Swift程序可以运行于目前已存在的平台之上,包含 iOS6以上 和 OS X 10.8以上 都可以运行Swift的程序,SwiftObjective-C的代码可并存于单一程序内, 这种延伸就如同 CC++ 的关系一样。
      为了争取大量的开发人员并重复使用已存在的代码,Xcode 6 允许在 app target 导入 Objective-C 文件供给 Swift 使用,通过 Objective-C 的桥接头文件(bridging header)来暴露给 Swift。当开发人员添加 Swift 文件到现有的 Objective-C 应用程序时,Xcode 会自动创建这些头文件。例如,一个 Swift 知名的类别 "TestClass" 可用于 Objective-C 的方式 #import "TestClass.h"

    • 存储器管理
      Swift全面使用自动引用计数(ARC)来管理存储器,替换过去Objective-C的垃圾回收机制。过去在Objective-C中,强引用(strong reference)即为非ARC中的retain,而弱引用(weak reference)即为非ARC中的assign。为了解决循环引用的问题,Swift提供unowned,不能设定为optional types,不能加上问号(?)或惊叹号(!

    • 除错以及其他元素
      Xcode的除错机制针对Swift语言提供REPL(Read-Eval-Print Loop环境,可以利用Swift语法来评估或与其他程序交互,使Swift编程具有类似Python与Ruby交互性接口(Interactive Shell

    • 类似Objective-C的地方

    • 基本数值类型(numeric types)大致相同 (例如Int, UInt, Float, Double)

    • 大量的C运算对象被移出Swift, 但又引入一些新运算对象

    • 大括号被用于组群陈述(group statements)

    • 变量的赋值使用等于符号, 但比较则使用(==)运算对象,还有一个新的运算对象,(===)被用来判断常数或变量之间是否为同一对象的实例

    • 中括号([])用于数组的表示, 可以根据索引值(index)来进行元素(element)的访问

    • 控制陈述, for, while, if, switchOjbective-C都十分类似, 但有延伸功能, 比如 for in 用于集合的轮询,switch 还可以接受非整数的cases条件值, 诸如此类

    • 不同于Objective-C之处

    • 陈述句不须再使用分号(;)做为结束,但分号还是可以在一行以内作为两行不同代码的分隔

    • 头文件(Header files)不再需要

    • 强类型(strong type

    • 类型推导

    • 支持泛型编程

    • 函数为第一级类型,这意味着函数可以作为其他函数的参数与返回值

    • 运算对象可在类别内重新定义 (运算对象重载),可以生成新的运算对象

    • 字符串全方面支持 Unicode,某些字符甚至可以成为语言的名称

    • 许多C语言过去的语法也被改变:

      • 不再存在指针
      • Assignments不再回传值,正确写法是 if (i==0) ,一般容易误写成** if (i=0) **会造成编译时期错误
      • switch的区块内不需要再使用break叙述句。另外,case后面都需要有可执行的代码(C或C++可连续使用多个case而不需要额外的代码),否则会发生编译错误
      • 变量和常数都要被初始化,而且数组的界限也要确认清楚
      • 溢出(overflows)的问题。C语言没有强制整数类型(signed integers)的界限,常常在运行时间发生问题。Swift可以通过整数类型的maxmin属性获取最大值或最小值

    4、示例程序

    变量的宣告方式如下:

    var smallMa = 120
    var smallHe = 127.3
    var smallYang: Double = 247.3
    

    let 声明常量的方式如下:

    let age = 22
    let birthday = 1994
    let cow = "I am a cow,I eat greens"
    let milk = " (age + birthday) "
    

    Swift不支持隐式类型转换,因此数与字符串之间要以显式类型转换:

    let tom = "The weight of tom is "
    let jerry = 250
    let tableWidth = tom + String(jerry)
    

    不能少的Hello World

    print("Hello, world") 
    

    可以使用Unicode字符,例如在文本内容有不同语言的文字时就可以放心添加,不必担心出现无法解读的乱码:

    let 人 = ["王亮": 67, "李梅": 28, "盖伦": 33, "李青": 25]
    for (name, age) in 人 {
        print("\(name)是\(age) 岁。")
    }
    

    ** Playground **log:

    图片.png

    5、参考资料

    相关文章

      网友评论

          本文标题:认真认识Swift

          本文链接:https://www.haomeiwen.com/subject/dtunvttx.html