swift_swiftui - CSDN
swift 订阅
Swift,苹果于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用于搭建基于苹果平台的应用程序。Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。 [1]  2015年12月4日,苹果公司宣布其Swift编程语言开放源代码。长600多页的The Swift Programming Language [2]  可以在线免费下载。 展开全文
Swift,苹果于2014年WWDC苹果开发者大会发布的新开发语言,可与Objective-C共同运行于macOS和iOS平台,用于搭建基于苹果平台的应用程序。Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。 [1]  2015年12月4日,苹果公司宣布其Swift编程语言开放源代码。长600多页的The Swift Programming Language [2]  可以在线免费下载。
信息
中文名
雨燕
参考语言
C,JavaScript,Python,Java
系    统
macOS,iOS,linux
源    于
Objective-C
外文名
Swift
发布时间
2014年6月2日
发行组织
Apple
SWIFT发展历史
2014-6-3 Swift于WWDC苹果开发者大会发布。 发布(6张) 2014-6-4 《Swift中文版》翻译组在github上进行协同翻译 [3]  。此项目开始不到一周就获得了1067个star。该项目的发起人是北航的大三学生 [4]  。2014-6-12《Swift中文版》第一版发布 [5]  。2015年12月4日,苹果公司宣布其Swift编程语言开放源代码 [3]  。长600多页的The Swift Programming Language [2]  可以在线免费下载。同时可以在苹果官方Github下载 [3]  。2020年最新一期的编程语言排行榜显示,Swift从第15名上升至第9名。 [6] 
收起全文
  • 本视频主要介绍Swift程序开发环境、Swift 语法基础、运算符、Swift原生数据类型、Swift原生字符串、控制语句。本视频是基 于Swift2.x版本录制,与图书《从零开始学Swift》语法篇同步讲解。是学习Swift视频,进行iOS...
  • 包含常量与变量、基本数据类型,以及Swift语言中的新数据类型—元组型和可选型的内容。同时还讲解了运算符和表达式、流程控制语句、字符和字符串、集合类型、函数和闭包。此外,Swift面向对象的枚举、结构体、类,...
  • swift基础视频教程

    2019-06-24 13:19:21
    Swift,苹果于2014年苹果开发者大会发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。 Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力...
  • 介绍Swift中扩展和协议的基本概念及重要性。介绍了协议的概念、方法和属性,另外,还说明了“面向协议编程”的重要意义。介绍了Swift中泛型的重要性。在后面介绍Swift中的内存管理机制,讲述了ARC内存管理的原理,...
  • 在这里,我们手把手教你学习Xcode7和Swift2语言!重点是一看就懂,一学就会! 本篇视频教程拥有115节课程,包含数据处理、常用插件、信用卡卡号识别、自动化测试、网络访问、多线程、ShareSDK社会化分享、Core...
  • swift杂乱整理

    2018-07-26 09:44:12
    001--swift简史小视频 002--Playground体验 003--常量&变量 一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年...

    001--swift简史小视频

    002--Playground体验

    003--常量&变量

    一、swift简史

    1、介绍

    swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入swift语言的研发,于2014年发布这一语言的第一版本。swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是增添了一些新特性。这些新特性需要在Xcode9上运行才能显示出效果。值得一提的是它支持unicode9,也就是说,可以用某些图片图标来充当变量。

    例如:

    0.png

    2、特点

    • swift取消了预编译指令,宏也被包括在内。某些开发者为了让Objective-C和swift代码兼容,会尽少在Objective-C中定义宏。
    • 取消了Objective-C中的指针等其他不安全访问的使用
    • 使用点语法来调用属性或者函数
    • 去除了NS前缀

    3、为什么要学习swift

    • swift作为面向协议语言,不仅能写移动端,也可以做到搭建服务器端。
    • 纵观国内外iOS开发界,已经有许多公司直接或间接采用swift开发,使用swift语言开发已成为未来iOS开发的趋势。
    • swift以简洁、优雅等优点迅速俘获广大开发者的青睐。

    二、用playground体验swift开发

    打开Xcode,选择创建一个playground项目

    创建一个普通的UIView对象

    正如上图所示,playgound文件的左边是代码区,右边则是显示结果的区域。当点击用于眼睛时会实时显示出界面效果。

    swift与objective-C的重大区别

    • 在swift中是没有.h和.m文件之分的。所有的代码全部都存储在一个文件里面。
    • 在swift中所有的代码都被封装在{}里面
    • OC使用alloc init进行初始化,而swift使用()
    • OC中使用[]来调用方法,而swift中采用点语法。比如UIColor.red
    • swift中不需要用分号分割语句

    三、常量和变量

    1、数据类型

    在swift中也有各种数据类型来存储不同的信息。下表列举的是常见的数据类型变量。

    但其实,在swift中,是不存在基本的数据类型的,所谓的数据类型,其实都只是结构体。这也是swift中的一个特点。

    2、变量和常量

    声明

    swift中用let声明常量,用var声明变量。

    1

    2

    3

    4

    var x = 10;

    let y = 20;

     

    let z   //错误示范,let z 在声明的时候并没有赋值常量是不可改变的,只能在声明时赋值

    在开发中,通常会优先选择使用let,因为不可变会更安全一点。所以建议在写代码之时,先选择let,等到需要变化的时候再改成var。

    自动推导

    创建一个UIView,不指定类型。可以看到控制台上会打印出UIView的信息。这个现象被称为swift的自动推导。事实上,在代码左侧定义的类型只是程序员希望的类型,而右侧才是程序真实的类型。

    1

    2

    let z = UIView()

    print(z)

    也就是说,变量或常量的类型会根据右侧代码执行的结果,推导出对应的类型。

    可以使用热键option点击查看类型。

    swift对类型的严格要求

    在swift中,任何不同类型的数据之间是不允许直接运算的。比如下面这段代码就会报错。

    1

    2

    3

    4

    //错误示范

    let a = 10

    let b = 12.5

    print(x + y)

    如果非要让不同类型数据之间能够运算,可以将其中一个类型进行转换。

    1

    2

    3

    let a = 10

    let b = 12.5

    print(a + Int(b))

    此时得到的结果就是22。在swift中,做类型转换时是将数据括起来,相当于swift结构体中的构造函数。

    当然也可以将前面的整数转换成Double型。此时就能打印出小数来。

    1

    print(Double(a)+b)

    四、String类型和Bool类型

    1、String类型

    声明

    直接用双引号将数据引起来

    1

    2

    let str = "小仙女"

    let str1:String "hahh"

    拼接

    字符串的连接有两种方法,一种是通过加号来连接,另一种则是通过反斜杆进行插入。

    1

    2

    3

    4

    let str = "小仙女"

    let mesg1 = "one"+str //用加号的方式

    let mesg2 = "two,\(str)" //反斜杠的方式

    print(mesg1,mesg2)

    在做字符串拼接时要注意加号和反斜杠后面都不能出现空格,不然会报错。

    拼接字符串时格式的变化

    假设在某些特定的地方需要输出特定位数的字符,比如或时间的输出,就需要使用占位符来调整字符串的格式。使用String的构造函数,调用format方法,%0后面加上数字就表示需要占多少位数。

    1

    2

    3

    4

    let min = 2

    let second = 10

     

    String(format: "d:d", min,second)

    遍历

    调用字符串的characters属性,采用for...in...的方式来遍历字符串。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    for in str{

        print(c)      //swift4中的遍历

    }

    print(str.count)  //打印字符串长度

     

    for char in myString.characters {

        print(char)   // swift3的遍历

     

    print(str..characters.count)  //swift3打印字符串长度

    字符串的截取

    最方便的方式就是将String类型转换成OC的NSString类型,再来截取。

    1

    2

    3

    4

    5

    6

    let urlStr = "www.baidu.com"

    let header = (urlStr as NSString).substring(to: 3)  //截取前三位

     

    let middle = (urlStr as NSString).substring(with: NSMakeRange(45))//去除前四个字符截取,范围之后五位字符

     

    let footer = (urlStr as NSString).substring(from: 10)   //从第十个字符开始截取

    2、Bool类型

    与其他语言一样,Bool类型表示的就是真假,但是不同于Objective-C,swift中用true和false来表示真假。

    五、可选类型

    在Objective-C开发中,如果一个变量暂时不会使用到,可以将它赋值为0或者赋值为空,而在swift中,nil是一个特殊的类型,如果它和真实类型不匹配是不能进行赋值的。但是开发中将变量赋值为空是在所难免的事情,因此就推出了可选类型。

    可选类型是swift的一大特色,在定义变量时,如果指定这个变量是可选的话,就是说这个变量可以有一个指定类型的值或者为nil。

    1、定义一个optional的变量

    1

    2

    let x:Optional = 10

    print(x)

    点击进去查看,可以发现Option其实是一个枚举类型。这个枚举有两个值,一个是none,表示没有值,而另一个是some,表示某一类值。

    在输出的时候,可以看见控制台上的内容Optional(10),它的作用就是提示这是一个可选值。

    而在实际开发中,一般不用上述方式创建可选值,而是指定一个类型,再在其后添一个问号。

    1

    2

    3

    4

    let x:Optional = 10  //第一种写法

     

    let x:Int? = 20     //第二种写法

    print(x)

    上述代码问号的意思就是定义一个可选的Int类型,可能没有值,也可能有一个整数。

    2、 解包

    试试将上面案例x和y相加,这个时候还能输出结果么?

    此时可以看到编译器已经报错。在前面的教程中提到过,不同类型的值是不能直接运算的。而可选项有两种值的产生,若它的值为nil则不能参加计算。

    因此引入解包的概念,“!”代表强制解包。它的意思是从可选值中强行获取对应的非空值。

    1

    print(x!+y!)

    3、解包常见错误

    1

    2

    3

    //错误示范1

    let y : Int?

    print(y)

    使用let定义的是常量,在初始化时必须要给出值。

    1

    2

    3

    //错误示范2:

    let y : Int? = nil

    print(y)

    强制解包是危险操作,如果可选值为nil,强制解包系统会奔溃。

    4、let和var的可选项默认值

    1

    2

    3

    4

    5

    //默认值测试

    let x: Int?

    print(x)

    var y :Int?

    print(y)

    用let做测试时会直接报错,说明let的可选值是没有默认值的,而用var做测试时,报错信息就变成了警告,运行的结果为nil。可以由此推测出var的可选项默认值为nil。

    swift中有规定,对象中的任何属性在创建对象时,都必须有明确的初始化值。

    5、可选绑定

    用if let/var表示。它将变量赋值给一个临时变量,在这个操作中会做两步操作:首先判断变量是否有值,如果没有值,则直接不执行大括号里面的内容;如果有值,系统会自动将变量进行解包,并且将解包后的结果,赋值给临时变量。

    比如下面这个例子:

    通过一个字符串创建NSURL对象

    1

    let url: URL? = URL(string: "https://www.baidu.com")

    接着创建NSURLRequest对象。强制解包非常危险,当url有中文的时候可能会变成nil。所以要判断url是否为空再对其进行解包。

    1

    2

    3

    if let url = url {

        let request = URLRequest(url: url)

    }

    六、swift中的分支

    1、if语句

    在swift中,if语句是不用带小括号的,但是后面跟的语句必须有花括号,哪怕只有一行代码。许多公司的代码规范也是规定必须使用这一格式。

    注意:在swift中没有非0即真的说法,所以不能写成if(num)这样的格式。

    1

    2

    3

    4

    5

    6

    let x = 9

    if x > 5 {

        print("小仙女")

    }else{

        print("妖精哪里跑")

    }

    2、三目运算符

    三目运算符的写法是表达式后跟一个问号,用冒号来隔开条件是否成立的值。

    1

    2

    let x = 10

    x > 5 ? print("小仙女"):print("妖精")

    非常有意思的是,如果开发者只想处理条件成立的部分,此时可以在冒号后面用一个小括号来代替条件不成立的部分。

    1

    x > 5 ? print("你都写了我两次啦"):()

    3、 三目运算符的简单模式

    三目运算符的简单模式通常是用于处理可选项的。“??”的意思是说,如果表达式有值,就使用那个值,如果没有,就使用“??”后面的值来代替。

    1

    2

    3

    let x:Int? = nil

    let y:Int? = 9

    print((x ?? 0) + (y ?? 0))

    运行之后的结果为9。

    之后再来说说运算符的优先级。举个简单的栗子

    1

    2

    3

    let name:String? = "安琪拉"

    print((name ?? "") + "火烧屁屁咯")

    print(name ?? "" "火烧屁屁咯")

    从运行的结果可以看到,“??”的优先级是最低的。如果没有小括号的约束,它会将后面的语句都当成是一个表达式。

    4、 guard的用法

    分支若是写得过多,就会导致代码可读性较差的问题。为了降低代码的层次,swift推出了guard。guard后面跟判断表达式,else后面写表达式不成立的代码。

    需要注意的是guard必须写在函数内部,在最末尾出必须要跟关键字return/continue/break/throw中的一种。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    import UIKit

    let age = 20

    func online(age : Int){

        guard age >= 18 else {

            print("还未成年呢")

            return

        }

        print("一起来开黑吖")

    }

    这样或许看不到guard的特别之处,但若是像下面这样的代码出现呢?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    let age = 20

    let money = true

    let idcard  = true

    func online2(age : Int,money:Bool,idcard:Bool){

        if age >= 18 {

            if money {

                if idcard {

                    print("一起来开黑吖")

                }else{

                    print("回去带身份证吧")

                }

            }else{

                 print("回去拿钱")

            }

        }else {

            print("还未成年呢")

        }

    }

    //调用

    online2(age: age, money: money, idcard: idcard)

    如果用普通的分支方法,就会显得可读性太差。我们可以试着将它改成guard的写法。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    func online1(age : Int){

        //判断年龄

        guard age >= 18 else {

            print("还未成年呢")

            return

        }

        //判断是否有钱

        guard money else {

            print("回去拿钱")

            return

        }

        //判断是否带了身份证

        guard idcard else {

             print("回去带身份证吧")

            return

        }

        print("一起来开黑吖")

    }

    执行完所有的判断语句之后才执行代码库,阅读性也比if……else分支强。

    5、 switch

    最基本的用法

    switch后面的小括号可以省略。用case关键字来表示不同的情形,case语句结束后,break也可以省略。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    let sex = 0

    switch sex {

    case 0:

        print("男")

    case 1:

        print("女")

    default:

        print("其他")

    }

    基础语法的补充

    如果系统某一个case中产生case穿透,可以在case结束后跟上fallthrough

    1

    2

    3

    case  0:

        print("男")

        fallthrough

    case后面可以判断多个条件,这些条件以逗号分开

    1

    2

    3

    4

    5

    6

    7

    8

    let sex = 0

    switch sex {

    case  0,1:

        print("正常人")

         

    default:

        print("其他")

    }

    switch可以判断浮点型、字符串类型和Bool类型

    1

    2

    3

    4

    5

    6

    7

    switch 3.14 {

    case  0:

        print("正常人")

         

    default:

        print("其他")

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    let opration = "+"

    switch opration {

    case  "+":

        print("加法")

    case "-":

        print("减法")

    default:

        print("其他")

    }

    七、swift的for循环和表示区间

    1、变化

    在swift3开始,就已经弃用了var i = 0; i < 10; i++的这种写法。并且++这种写法也被取消掉了,改为+=代替。

    2、表示区间

    swift常见区间有两种,开区间用..<表示,闭区间用...表示。要注意的是数字和省略号之间是不能加空格的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    func demo1() {

        for in 0..<5 {

            print(i)

        }

        print("^^^^^^^")

         

        for in 0...5 {

            print(i)

        }

    }

    demo1()

    3、逆序操作

    如果想要做逆序操作,只要在in后面的表达式后添加reversed()即可。

    1

    2

    3

    4

    5

    6

    func demo1() {

        for in (0..<5).reversed() {

            print(i)

        

    }

    demo1()

    八、swift中的数组

    Swift语言提供了Arrays、Sets和Dictionaries三种基本的集合类型用来存储集合数据。数组是有序数据的集,集合是无序无重复数据的集,而字典则是无序的键值对的集。

    数组使用有序列表存储同一类型的多个值。相同的值可以多次出现在一个数组的不同位置中。

    1、定义数组

    用let定义出来的数组就是不可变的

    1

    2

    //定义不可变数组

    let array = ["爱丽丝","小红帽","白雪公主"]

    使用var来定义可变数组。正确的写法是Array这样的形式。其中Element是这个数组中唯一允许存在的数据类型。但是为了简便,推荐使用[Element]()的写法。

    1

    2

    3

    4

    //定义可变数组

    var arrayM = [String]()

    var arrayM1:[String]

    var arrayM2 = Array()

    2、创建带有默认值的数组

    swift中的array类型还提供一个可以创建特定大小并且所有数据都被默认的构造方法。开发者可以在里面指定它的数量和类型。

    1

    2

    var threeDouble = Array(repeating: 0.0, count: 3)

    print(threeDouble[1])

    3、对可变数组的基本操作

    使用append给数组添加元素

    1

    2

    3

    4

    5

    arrayM.append("1")

    arrayM.append("2")

    arrayM.append("3")

    arrayM.append("4")

    arrayM.append("5")

    使用insert方法将值添加到具体索引值之前

    1

    arrayM.insert("10", at: 2)

    使用remove系列方法可以对数组做删除操作

    1

    2

    3

    4

    arrayM.remove(at: 0)

    arrayM.removeSubrange(1..<3)

    arrayM.removeAll()

    arrayM.removeLast() //可以去除最后一项,避免捕获数组count属性

    通过取下标的方式对数组进行修改和查找

    1

    2

    arrayM[0] = "小红帽"

    print(arrayM[2])

    利用区间对具体范围内的值替换

    1

    2

    3

    //替换第2项和第3项的值

    arrayM[2...4] = ["22","33"]

    print(arrayM[3])

    4、数组的遍历

    1.png

    若同时需要每个数据项的值和索引,可以使用数组的emumerated()方法来进行数组遍历。

    1

    2

    3

    for(index,value) in arrayM.enumerated(){

        print(String(index+1)+":"+value)

    }

    5、数组的合并

    只有相同类型的数组才能进行合并。

    1

    let resultArray = arrayM + array

    九、swift中的集合

    集合(Set)用来存储相同类型并且没有确定顺序的值。当集合元素顺序不重要时或者希望确保每个元素只出现一次时可以使用集合而不是数组。

    集合中的元素必须有确定的hashvalue,或者是实现了hashable协议。而swift提供的Int,String等类型其实都是实现了hashable协议的。hashable是equable的子协议,如果要判断两个元素是否相等,就要看他们的hashvalue是否相等。

    1、定义集合

    使用set定义。

    Element表示集合中允许存储的类型,和数组不同的是,集合没有等价的简化形式。

    1

    2

    3

    4

    //创建空集合

    var letters = Set()

    //使用字面量创建集合

    var favorite:Set = ["绮罗生","意琦行"]

    要注意的是一个Set类型是不能直接后面跟的字面量被单独推断出来的,因此这个Set是必须要显示声明的。但是由于swift的自动推断功能,可以不用写出Set的具体类型。比如说上面那个例子,省去String,也能推断出Set的正确类型。

    1

    var favorite:Set = ["绮罗生","意琦行"]

    2、访问和修改集合

    通过.count属性知道集合的长度,通过isEmpty判断集合是否为空。

    3、添加元素

    1

    2

    favorite.insert("寒烟翠")

    print(favorite.count)

    4、删除元素

    通过remove的方法删除元素,若这个值真的存在就会删除改值,并且返回被删除的元素。若集合中不包含这个值,就会返回nil。

    1

    2

    3

    4

    5

    if let removeBack = favorite.remove("意琦行"){

        print(removeBack)

    }else{

        print("没有找到值")

    }

    5、集合操作

    swift提供了许多数学方法来操作集合。

    1

    2

    3

    4

    print(oddD.union(evenD).sorted()) //并集

    print(oddD.intersection(evenD).sorted())//交集

    print(oddD.subtracting(siggleDPrime).sorted())//取差值

    print(oddD.symmetricDifference(siggleDPrime).sorted())//去掉相同值

    6、遍历集合

    1

    2

    3

    4

    5

    6

    7

    for item in favorite {

        print(item)

    }

    //按照首字母的顺序输出

    for item1 in favorite.sorted() {

        print(item1)

    }

    7、集合的成员关系

    用 ==来判断两个集合是否包含全部相同的值

    用 isSubset(of:)来判断一个集合中的值是否也被包含在另外一个集合中

    用 isSuperset(of:)来判断一个集合中包含另一个集合所有的值

    用isStrictSubset(of:)或者isStrictSuperset(of:)方法来判断一个集合是否是另外一个集合的子集合或父集合并且两个集合不相等

    十、字典

    字典是一种存储多个相同类型的值的容器。每个值value都关联这唯一的键key。键就是这个字典的标识符。而且字典中的数据项并没有具体顺序。键集合不能有重复元素,而值集合是可以重复的。

    1、定义字典

    使用let定义不可变的字典,使用var定义可变字典。用字面量赋值时,系统会自动判断[]中存放的是键值对还是要一个个的元素。

    1

    2

    3

    4

    5

    6

    let dict = [1:"one",2:"two",3:"three"]  //定义不可变字典

     

    var dictM = Dictionary()  //定义可变字典

    var dictM1 = [String:NSObject]()

     

    //AnyObject一般用于指定类型,NSObject一般用于创建对象

    2、对可变字典做基本操作

    添加、删除和获取元素

    1

    2

    3

    4

    5

    dictM1["name"] = "小仙女" as NSObject

    dictM["age"] = 17 as NSObject

    dictM.removeValue(forKey:"name")

    //获取:swift中只保留了最简单的写法,OC中有objectforkey的方法在swift中也被删除掉了。

    dictM["name"]

    3、修改元素

    若字典中已经有对应的key,操作的结果是直接修改原来的key中保存的value。若字典中没有对应的key,则会添加新的键值对。

    1

    dictM["name"] = "llx"

    4、遍历字典

    可以通过范围for遍历所有的key和value。也可以遍历所有的键值对。

    1

    2

    3

    4

    for (key,value) in dictM {

        print(key)

        print(value)

    }

    5、合并字典

    合并字典时通过遍历的方式将第二个字典的内容添加到第一个字典中。绝对不能用相加的方式对字典进行合并。

    1

    2

    3

    4

    5

    6

    7

    var dict1 = ["name":"llx","age":"17"]

    var dict2 = ["num":"007"]

     

    for (key,value) in dict2 {

        dict1[key] = value

    }

    dict

    十一、元组

    元组是swift中特有的一种数据结构,用于定义一组数据,元组在数学中的应用十分广泛。

    1、定义元组

    使用()包含信息,组成元组类型的数据可以被称为“元素”。

    1

    2

    //使用元组来描述个人信息

    let info1 = ("1001","张三",30)

    2、起别名

    可以给元素加上名称,之后可以通过元素名称访问元素

    1

    2

    3

    //给元素加上名称,之后可以通过元素名称访问元素

    let info2 = (id:"1001",name:"张三",age:30)

    info2.name

    元组一般用于作为方法的返回值。元组中元素的别名,就是元组的名称

    1

    2

    let (name,age) = ("张三",18)

    name

    十二、函数

    函数相当于Objective-C中的方法,是一段完成特定任务的独立代码片段。可以通过给函数命名来标志某个函数的功能。而这个名字可以用来在需要的时候“调用”该函数完成其任务。格式如下:

    1

    2

    3

    4

    func 函数名(参数列表)-> 返回值类型 {

        代码块

        return 返回值

    }

    func表示关键字,多个参数列表之间用逗号隔开,也可以没有参数。使用->指向返回值类型。如果没有返回值,可以用Void代替,也可以省略。

    1、定义无参无返回的函数

    1

    2

    3

    4

    func phone()->Void {

        print("小米")

    }

    phone()

    2、定义有参无返回的函数

    1

    2

    3

    4

    func phoneNum() -> String {

        return "123456"

    }

     print(phoneNum())

    3、定义有参无返回的函数

    1

    2

    3

    4

    func callPhone(phoneNum:String){

        print("打电话给\(phoneNum)")

    }

    callPhone(phoneNum: "123456")

    4、定义有参有返回的函数

    1

    2

    3

    4

    func sum(num1 : Int,num2 : Int) -> Int{

        return num1 + num2

    }

    sum(num1: 30, num2: 30)

    在swift4之后,调用函数的时候,能直观的看到参数。而在之前调用之时,只能看见第二个参数之后的名称,表达起来并不直观。如何解决这个问题呢?

    可以采用给参数起别名的方式,在参数前面添加一个别名。

    1

    2

    3

    4

    func sum(number1 num1: Int,number2 num2 : Int) -> Int{

        return num1 + num2

    }

    sum(number1: 2, number2: 4)

    5、默认参数

    在swift中可以给方法的参数设置默认值。比如说买甜筒的时候,商店默认会给顾客准备原味冰淇淋。但是用户也可以选择指定口味。

    1

    2

    3

    4

    5

    func makeIceCream(flavor:String "原味") -> String {

        return "制作一个\(flavor)冰淇淋"

    }

    makeIceCream()

    makeIceCream(flavor: "抹茶")

    6、可变参数

    有些时候,在创建方法的时候,并不确定参数的个数,于是swift推出了可变参数。参数的类型之后使用...表示多个参数。

    1

    2

    3

    4

    5

    6

    7

    8

    func sum(num:Int...) -> Int {

        var result = 0

        for in num {

            result += i

        }

        return result

    }

    sum(num: 18,29,3)

    7、引用传递

    如果现在有这样一个需求:要交换两个数的值,不能使用系统提供的方法。要如何来完成呢?

    如果按照上面的写法就会报错,可以按住option键查看,参数默认是不可变的。

    而且就算可行,做到的也是值传递。为了解决这一问题,swift提供了关键字inout来声明数据地址传递,也被称之为引用传值。在swift3.0的时候,inout的位置发生了改变,被放置在标签位置。但是作用与之前相同。

    1

    2

    3

    4

    5

    6

    7

    func swapNum1( m : inout Int, n : inout Int) {

        let tempNum = m

        m = n

        n = tempNum

    }

    swapNum1(m: &m, n: &n)

    print("m:\(m),n:\(n)")

    十三、类

    swift用关键字class来定义类。通常情况下,定义类时,让它继承自NSObject,若没有指定父类,那么该类就是rootClass。类的格式如下:

    1

    2

    3

    class 类名:SuperClass {

        //定义属性和方法

    }

    1、定义存储属性和创建类对象

    对象的属性必须要赋值,用解包的方式赋值为nil。

    1

    2

    3

    4

    5

    6

    class Person : NSObject {

        //定义存储属性

        var age : Int = 0

        var name : String//对象的属性必须赋值,不赋值会报错的哦

    }

    let p = Person()

    2、给类的属性赋值

    可以直接赋值,也可以通过KVC进行赋值

    1

    2

    3

    4

    5

    p.age = 10

    p.name = "llx"

    if let name = p.name {

        print(name)

    }

    3、定义方法

    在swift中,如果使用当前某一对象的属性或者方法,可以直接使用,不需要加self

    1

    2

    3

    4

    // 定义方法,返回平均成绩

    func getAverage() -> Double {

            return (mathScore + EnglishScore)*0.5

        }

    1

    let average = p.getAverage()

    4、定义计算属性

    通过别的方式计算到结果的属性,称之为计算属性。

    1

    2

    3

    var averageS : Double {

            return (mathScore + EnglishScore) * 0.5

        }

    5、定义类属性

    类属性是和整个类相关的属性,用static修饰,作用域是整个类。通过类名进行访问。

    1

        static var courseCount : Int = 0

    在类外通过类名访问类属性

    1

    Person.courseCount = 2

    6、类的构造函数

    构造函数类似于OC中的init方法。默认情况下创建一个类时,必定会调用一个构造函数。如果一个类继承自NSObjct,可以对父类的构造函数进行重写。

    在构造函数中,如果没有明确super.init()。那么系统会默认调用super.init()。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    class Person : NSObject {

        var name : String?

        var age : Int = 0

         

        override init() {

            print("hello world")

        }

    }

    let p = Person()

    7、自定义构造函数

    自定义构造函数可以传入参数,做赋值操作时采用self调用属性以示区分。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    class Person : NSObject {

        var name : String?

        var age : Int = 0

         

        // 自定义构造函数

        init(name:String,age:Int){

            self.name = name

            self.age = age

        }

    }

    // 调用自定义的构造函数

    let p1 = Person(name: "kaka", age: 12)

    print(p1.age)

    可以定义字典类型的构造函数。用KVC的方式将字典的值取出来,要调用系统的setValue方法就必须先调用系统的构造函数创建出对象。为了防止取出的对象没有属性而导致程序奔溃,需要重写系统的setValue方法。

    如果用KVC的方式一定要先调用父类的构造函数。因为系统默认调用是放在方法最后面调用的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    class Person : NSObject {

       @objc var  name : String?

       @objc var age : Int = 0

             

        init(dict:[String : Any]) {

            super.init()

       // 要调用系统的`setValue`方法就必须先调用系统的构造函数创建出对象

            setValuesForKeys(dict)

        }

        // 防止奔溃

        override func setValue(_ value: Any?, forUndefinedKey key: String) {

        }

    }

     

    let p2 = Person(dict:["name":"lala","age":18,"score":33])

    p2.name

    p2.age

    由于swift与objective-c的编译方式不同,用KVC字典转模型构造函数时,需要在属性前面加上@objc。

    8、类的属性监听器

    在object-c中,我们可以重写set方法来监听属性的改变,而在swift中也可以通过属性观察者来监听和响应属性值的变化。通常用于监听存储属性和类属性的改变。对于计算属性则不需要定义属性观察者,因为我们可以在计算属性的setter中直接观察并响应这种值的变化。

    可以通过设置以下观察方法并响应这种值的变化。

    willSet:在属性值被存储之前设置,此时新属性值作为一个常量参数被传入。该参数名默认为newValue,开发者可以自己定义该参数名。

    didSet:在新属性值被存储后立即调用,与willSet不同的是,此时传入的是属性的旧值,默认参数名为oldValue。

    上面两个方法都只有在属性第一次被设置时才会调用,在初始化时,不会去调用这些监听方法。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    class Person : NSObject {

        //属性监听器

        var name:String? {

            willSet {

                print(name as Any)

                //如果想要查看接下来的新值,可以使用newValue

                print(newValue as Any)

            }

            didSet {

               print(name as Any)

            }

        }

    }

     

    let p = Person()

    p.name = "llx"

    十四、闭包

    闭包是swift中非常重要的一个知识点。类似于objective-c中的block,其实函数就相当于一个特殊的闭包。闭包需要提前写好,在适当的时候再执行。

    1、定义闭包

    闭包的格式是(参数列表)->(返回值类型) in 实现代码

    举一个最简单的栗子 

    用常量记录一个代码块,按住option键就能看到,b1是一个闭包。再到适合的地方去调用它。

    1

    2

    3

    4

    let b1 = {

      print("干掉他们")

    }

    b1()

    再来看一个带参数的闭包。在闭包中,参数、返回值和实现代码都是写在花括号里面的。in是用来定义分割和实现的。

    1

    2

    3

    4

    5

    let b2 = {

        (x:String)->() in print(x)

    }

     

    b2("string")

    2、闭包案例

    这个案例要模拟封装一个网络请求的类。利用闭包将jsonData类型的数据传递给展示页面。

    创建一个新的项目,选择swift语言

    封装一个网络请求的类HttpTool.swift继承自NSObject

    用异步线程模拟网络数据请求,再回到主线程中回调闭包

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    class HttpTool: NSObject {

        //闭包类型:(参数列表)->(返回值类型)

      

        func loadData(callback:@escaping(_ jsonData : String)->()) {

            DispatchQueue.global().async {

                print("发生网络请求:\(Thread.current)")

            }

            

            DispatchQueue.main.async {

                ()->Void in

                print("获取到数据,并且回调:\(Thread.current)")

                

                callback("jsonData数据")

            }

        }

    }

    到需要接收数据的界面定义Httptool类的属性,设置一个初始化值,将初始值赋值给变量

    在swift中是不需要引入头文件的,文件之间可共享12345678910111213import UIKit class ViewController: UIViewController {     var tools : HttpTool = HttpTool()        override func touchesBegan(_ touches: Set, with event: UIEvent?) {        //用闭包将json数据拿到        tools.loadData { (jsonData) ->() in            print("在viewcontroller中拿到数据\(jsonData)" )        }    }}

    3、尾随闭包

    尾随闭包用于需要将一个很长的闭包表达式作为最后一个参数传递给函数。也就是说如果按时的最后一个参数是闭包,那么在调用它的时候就可以把这个闭包写在括号外面,并紧跟括号,函数的其他参数则仍然写在括号之中。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    //这个函数接受一个String和一个闭包

    //函数体内调用闭包,并且将String作为参数传递给闭包

    func myFunc(strP:String,closeP:(String)->Void) {

        closeP(strP)

    }

     

    //普通调用

    myFunc(strP: "hello", closeP: {(string) in print(string)})

    //尾随闭包

    myFunc(strP: "hello") {

        (string) in print(string)

    }

    4、逃逸闭包

    当一个闭包作为参数传到一个函数中,但是该闭包要在函数返回之后才被执行,于是就称这样的闭包为逃逸闭包。也就是说闭包逃离了函数的作用域。写法是在这个闭包参数前加一个@escaping用来指明这个闭包是允许逃逸出该函数的。

    声明一个方法,这个方法是一个逃逸闭包

    该方法要做的事情,就是将闭包添加到数组中去

    1

    2

    3

    4

    5

    6

    7

     //定义数组,里面的元素都是闭包类型的

    var callBackArray : [()->Void] = []

     

    //定义一个接收闭包的函数

    func testEscapingClosure(callBack:@escaping ()-> Void) {

        callBackArray.append(callBack)

    }

    当改变数组的时候,取第0个元素调用。此时就改变了变量x的值

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    class SomeClass {

        var x = 10

         

        func doSomething(){

            testEscapingClosure {

                self.x = 100

            }

        }

    }

     

    let instance = SomeClass()

    instance.doSomething()

    print(instance.x)

    callBackArray.first?()

    print(instance.x)

    因为逃逸闭包是函数执行之后才会执行,所以可以这样理解:创建一个类的对象instance;在对象中初始化一个x=10;利用对象执行了函数doSomething;函数内部调用全局函数testEscapingClosure,期望修改instance对象的x值为100,但是此时并没有执行这个包含了赋值语句的闭包。

    查找全局数组callBackArray,找到里面第一个元素,显然找到的是在testEscapingClosure函数中添加的闭包{self.x = 100},此时才通过全局数组的查询找出闭包并执行,于是x此时才被赋值为100。这就是在函数执行完毕后才执行闭包。刚好符合逃逸闭包的定义。

    结论: 逃逸闭包将在函数执行之后执行,于是这段代码最后输出为100是因为闭包最后才被执行……

    解决循环引用的三种方式

    1、可以使用weak关键字将对象之间的联系变为弱引用

    1

    weak var weakself = self

    2、第一种方式的简化

    1

    [weak self]

    3、使用unowned解决

    1

    [unowned self]

    但是该方法十分危险,要确保数据一定有值。否则会发生奔溃。

    __weak 与__unretained有何区别?

    • __weak修饰的弱引用,如果指向的对象被销毁,那么指针会立马指向nil
    • __unretained修饰的弱引用,如果指向的对象被销毁,它的指针依然会指向之前的内存地址,很容易产生野指针(僵尸对象)

    十五、tableView的用法

    1、 懒加载

    swift中也有懒加载的方式,并且在swift中有专门的关键字lazy来实现某一个属性实现懒加载。

    格式:lazy var 变量:类型 = {创建变量代码}()

    懒加载的本质在第一次使用的时候执行闭包,将闭包的返回值赋值给属性,并且只会赋值一次。

    1

    2

    3

    4

    5

    6

    7

    //懒加载只能用于结构体或者类的成员变量中

    class Person:NSObject {

        lazy var array : [String] = {

            ()->[Stringin

            return ["llx","lll"]

        }()

    }

    2、tableView的使用

    使用步骤如下:

    创建tableView对象

    使用懒加载的方式,到需要用到的时候再创建tableView。将tableView添加到控制器上的View。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    class ViewController: UIViewController {

        

        lazy var tableView:UITableView = UITableView()

        override func viewDidLoad() {

            super.viewDidLoad()

            view.addSubview(tableView)

            

            }

    }

    设置tableView的frame

    1

    tableView.frame = view.bounds

    设置数据源和代理

    实现UITableView的协议,并为tableView设置数据源

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

        

        lazy var tableView:UITableView = UITableView()

        override func viewDidLoad() {

            super.viewDidLoad()

           

            view.addSubview(tableView)

            tableView.frame = view.bounds

            //设置数据源

            tableView.dataSource = self

            tableView.delegate = self

        }

    }

    实现代理方法

    1

    2

    3

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return 20

        }

    创建cell。因为cell是个可选类型,有可能有值,也可能为nil。所以要进行判断。给cell设置数据的时候,选择textLabel点击option会发现textLabel也是可选类型。

    在最后返回cell的时候,对cell进行强制解包。因为之前已经做过判断,所以不会出现程序奔溃的问题。

    1

    2

    3

    4

    5

    6

    7

    8

    9

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let CellID = "CellID"

            var cell = tableView.dequeueReusableCell(withIdentifier: CellID)

            if cell == nil {

                cell = UITableViewCell(style: .default, reuseIdentifier: CellID)

            }

            cell?.textLabel?.text = "测试数据:\(indexPath.row)"

            return cell!

        }

    实现点击的代理方法

    1

    2

    3

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            print("点击了:\(indexPath.row)")

        }

    十六、swift中的注释

    在swift中,类似于paramg --mark的写法是不可行的。

    它是如下两种形式

    //MARK:- 要写的内容 用于分组

    1

    2

    3

    4

    5

    6

    7

    8

    class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

        // MARK:- 懒加载

        lazy var tableView:UITableView = UITableView()

        // MARK:- 系统回调函数

        override func viewDidLoad() {

            super.viewDidLoad()

            }

        }

    这样写的话,就可以在菜单栏看到分组的信息

    /// 提示信息 用于提示

    若在tableView系列的某个方法上面写上///提示,到其他地方调用该方法时,会出现前面写的注释信息。

    十七、枚举

    1、定义

    在swift中,枚举使用的是由enum关键字来创建的枚举,枚举的所有成员都放在一对大括号里面。它为一组相关的值定义一个共同的类型。使用case关键字来定义一个新的枚举成员值。

    1

    2

    3

    4

    5

    6

    7

    enum SomeEnum {

        // 在这里定义枚举

        case north

        case south

        case east

        case west

    }

    上面这个枚举定义的东南西北四个值就是这个枚举的成员值。与C语言和objective-c不同的是,swift的枚举成员值在创建的时候并不会被赋予一个默认的整形值。这些值的类型就是刚刚定义好的枚举的名字SomeEnum。

    如果希望多个成员值要写在同一行中,可以使用逗号将他们分割开。

    1

    2

    3

    enum Plant {

        case mercury,earth,mars

    }

    每个枚举都定义了一个新的类型,就像swift中的其他类型一样。此时可以把它赋值给一个变量,而且可以用点语法这种形式调用。

    1

    2

    3

    var directionT = SomeEnumeration.west

     

    directionT = .east

    注意:在switch中使用枚举值的时候,一定要穷举出所有的情况,如果忽略其中的一个,代码都无法编译通过。因为它没有考虑到枚举类的全部成员。如果说不需要匹配所有的枚举成员,可以提供一个default分支来涵盖其他未明确处理的枚举成员。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    class Person:NSObject{

        var directionT = SomeEnum.west

      

        func direc()  {

            switch directionT {

            case .north:

                print("north")

            case .east:

                print("east")

            default:

                print("没有方向")

            }

        }

    }

    2、关联值

    可以定义swift的枚举类存储任意类型的关联值,而且每个枚举成员的关联值类型都可以不相同。比如说,来创建一个条形码类型。类似于库存,可以有不同类型的条形码去识别商品,比如说通过数字,或者根据产品代码来识别。

    1

    2

    3

    4

    enum BarCode {

        case upc(Int,Int,Int,Int)

        case qrCode(String)

    }

    上面代码可以理解为定义一个名为BarCode的枚举类型。它的一个成员值是一个具有(Int,Int,Int,Int)类型关联值的upc,另一个成员值是具有String类型的qrCode

    之后可以使用任意的条形码类型去创建新的条形码

    1

    2

    3

    4

    5

    6

    7

    class Person:NSObject {

        // 创建一个名为pBar变量,并将Barcode.upc赋值给它。

        func function() {

            var pBar = BarCode.upc(9033)

            pBar = .qrCode("ABCD")

        

    }

    这个时候原来的barcode.upc和其整数关联值被新的Barcode.qrCode和其字符串关联值所替代了。

    3、枚举的原始值

    枚举的原始值就是枚举的默认值,这些原始值的类型必须相同。在定义枚举的时候必须给出类型。

    1

    2

    3

    4

    5

    enum ASCIICHAR : Character {

        case tab = "\t"

        case lineFeed = "\n"

        case carriageReturn = "\r"

    }

    在使用原始值为整数或者字符串类型的枚举时,不需要显式的为每一个枚举成员设置原始值,swift将会自动未它们赋值。

    1

    2

    3

    enum Planet : Int {

        case mercury = 1, venus,earth,mars

    }

    上面这个例子,Planet.mercury原始值是1,那么后面的venus就是2,之后以此类推。

    可以通过rawValue属性来访问枚举变量的原始值.

    1

    let earthsOrder = Planet.earth.rawValue

    4、枚举递归

    枚举成员的关联值为当前枚举类型时称为递归枚举。那我们可以通过使用indirect修饰枚举变量。indirect修饰整个枚举时,所有成员均可递归(也可不递归)

    1

    2

    3

    4

    5

    indirect enum Ari {

        case number(Int)

        case addition(Ari,Ari)

        case multi(Ari,Ari)

    }

    上面定义的枚举类型可以存储三种算术表达式:纯数字、两个表达式相加、两个表达式相乘。

    1

    2

    3

    4

    let five = Ari.number(5)

    let four  = Ari.number(4)

    let sum = Ari.addition(five, four)

    let product = Ari.multi(sum, Ari.number(2))

    通过枚举递归,就成功的创建了一个(5+4)*2的式子。

    十八、结构体

    结构体通过struct去声明。在swift中,用到了大量的结构体,比如说基本的数据类型都是结构体而不是类。这意味着它们被赋值给新的常量或者变量,或者被传入函数或方法中时,值会被拷贝。

    1

    2

    3

    4

    struct teacher {

        var name : String ""

        var age : Int  = 30

    }

    十九、扩展

    扩展 (Extension)可以做到无需修改原本的代码就直接把想要的功能实现。

    1

    2

    3

      extension 某个现有的class {

        //添加新功能

      }

    限制:

    • 不能添加任何已存在的 法或是属性
    • 添加的属性不能是存储属性,只能是计算属性

    1、扩展在方法中的应用

    1

    2

    3

    4

    5

    extension String {

        func sayHello() {

            print("Hello from extension")

        }

    }

    上面这段代码是对String做了一个扩展。之后声明一个变量调用扩展方法。

    1

    2

    var hello = "hi"

    hello.sayHello()

    此后,任何String类型都可以调用该扩展方法。

    2、用扩展进行计算

    1

    2

    3

    4

    5

    extension Int {

        var squared : Int {

            return (self * self)

        }

    }

    上面这段代码对Int扩展了一个属性,让它计算一个数字的平方值。

    1

    2

    3

    var newInt = 30

    newInt.squared

    999.squared

    3、扩展类或结构体

    创建一个普通类

    1

    2

    3

    class Lisa {

        var lisa = "半边天使"

    }

    对类扩展,新增一个方法,使其能做自我介绍

    1

    2

    3

    4

    5

    extension Lisa {

        func describe() -> String {

            return "我可是会傲娇的"

        

    }

    创建对象调用方法

    二十、泛型

    泛型可以让开发者写出灵活可重复使用的方法跟结构。

    先看一个栗子!!

    1

    2

    3

     var stringArray = ["Hi""Hello""Bye"]

     var intArray = [1,2,3]

     var doubleArray = [1.1,2.2,3.3]

    上面创建了三个不同类型的数组,若是要求打印所有数组中的元素,通常会怎么做呢?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    func printStringFromArray(a: [String]) {

          for in a {

    print(s) }

    }

      func printIntFromArray(a: [Int]){

          for in a {

    print(i) }

    }

      func printdoubleFromArray(a:[Double]) {

          for in a {

    print(d) }

    }

      printStringFromArray(a: stringArray)

      printIntFromArray(a: intArray)

      printdoubleFromArray(a: doubleArray)

    上面这段冗长的代码实在让人不忍直视。而泛型的出现正好可以解决这一问题。

    1

    2

    3

    4

    5

    func printEelementFormArray(a:[T]){

        for element in a {

                  print(element)

              }

          }

    这段代码中的T代表了任意的元素。无论上面类型的数据都能放入其中。之后只要调用者一个方法,传入不同的数组就能将不同类型的元素打印出来。

    二十一、协议

    1、对面向对象语言的吐槽

    • 使用子类时,协议继承父类的属性和方法。其中某些方法或属性并不是开发者所需要的。这会让代码变得异常的臃肿。
    • 若一个类拥有很多父类,会让开发者很难找到每个类中的问题并进行修改。
    • 对象引用到内存的同一地方,若是发生改变,可能会造成代码混乱的现象。

    而swift是一种面向协议的语言。协议其实就像篮球教练,会告诉选手如何去训练,但是教练本身并不会出现在球场。Swift中的protocol不仅能定义方法还能定义属性,配合extension扩展的使用还能提供一些方法的默认实现,而且不仅类可以遵循协议,现在的枚举和结构体也能遵循协议了。

    2、一个简单的协议案例

    创建一个简单的协议,并让一个结构体去遵循

    遵循协议的方法与继承类似。

    1

    2

    3

    4

    5

    protocol People {    

    }

     

    struct Lisa: People {    

    }

    完善协议

    给协议添加一些属性和方法,用get set 设定协议的状态。遵循协议时要了解变量是否能读取或赋值。

    1

    2

    3

    4

    5

    protocol People {

        var name: String {get set}

        var race: String {get set}

        func sayHi()

    }

    在结构体中实现协议的方法和变量

    1

    2

    3

    4

    5

    6

    7

    struct Lisa: People {

        var name: String "Lisa"

        var race: String "Asian"

        func sayHi() {

            print("Hi~, I'm \(name)")

        }

    }

    3、协议的继承

    创建一个协议,让该协议继承自之前创建的People协议

    1

    2

    3

    4

    5

    6

    7

    8

    9

    protocol superman {

          var canFly: Bool {get set}

          func punch()

    }

     

    protocol superman: People {

          var canFly: Bool {get set}

          func punch()

    }

    调用

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    struct AngleLisa: superman {

    var name: String "Lisa"

    var race: String "Asian"

    func sayHi() {

        print("Hi, I'm \(name)")

    }

    var canFly: Bool = true

    func punch() {

        print("punch  Vergil")

    }

    }

    由此可知,一旦协议进行了继承,不但要实现本协议中所声明的方法和属性,连协议父类的方法和属性也不能落下。

    二十二、swift4新特性

    以下内容来自 最全的 Swift 4 新特性解析

    感谢大佬提供学习资源!!!

    1、语法改进

    在扩展extension中可以访问private的属性

    举一个简单的栗子!

    1

    2

    3

    4

    5

    6

    7

    8

    9

    struct Date: Equatable, Comparable {

        private let secondsSinceReferenceDate: Double

        static func ==(lhs: Date, rhs: Date) -> Bool {

            return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate

        }

        static func  Bool {

            return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate

        }

    }

    上面代码定义了一个 Date 结构体,并实现 Equatable 和 Comparable 协议。为了让代码更清晰,可读性更好,一般会把对协议的实现放在单独的 extension 中,这也是一种非常符合 Swift 风格的写法,如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    struct Date {

        private let secondsSinceReferenceDate: Double

    }

    extension Date: Equatable {

        static func ==(lhs: Date, rhs: Date) -> Bool {

            return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate

        }

    }

    extension Date: Comparable {

        static func  Bool {

            return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate

        }

    }

    但是在 Swift 3 中,这样写会导致编译报错,extension 中无法获取到 secondsSinceReferenceDate 属性,因为它是 private 的。于是在 Swift 3 中,必须把 private 改为 fileprivate。

    1

    2

    3

    4

    struct Date {

        fileprivate let secondsSinceReferenceDate: Double

    }

    ...

    但是如果用 fileprivate,属性的作用域就会比我们需要的更大,可能会不小心造成属性的滥用。

    在 Swift 4 中,private 的属性的作用域扩大到了 extension 中,并且被限定在了 struct 和 extension 内部,这样struct的属性就不需要再用 fileprivate修饰了,这是最好的结果。

    类型和协议的组合类型

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    protocol Shakeable {

        func shake()

    }

     

    extension UIButton: Shakeable { func shake() {/* */ } }

    extension UISlider: Shakeable { func shake() {/* */ } }

     

    func shakeEm(controls: [???]) {

        for control in controls where control.state.isEnabled {

        }

        control.shake()

    }

    仔细思考上面的代码,如果是swift3中,func shakeEm(controls: [???])中的???应该写上面类型呢?如果写UIControl,那么调用control.shake()时就会报错。如果写Shakeable类型,那么control.state.isEnabled这条语句就会报错。

    swift4为了解决类似问题,实现了把类型和协议用&组合在一起作为一个类型使用的写法。把它声明为UIControl & Shakeable类型。

    1

    2

    3

    4

    5

    func shakeEm(controls: [UIControl & Shakeable]) {

        for control in controls where control.isEnabled {

            control.shake()

        }

    }

    Associated Type 可以追加 Where 约束语句

    在 Swift 4 中可以在 associatedtype后面声明的类型后追加 where 语句。

    1

    2

    3

    4

    protocol Sequence {

        associatedtype Element where Self.Element == Self.Iterator.Element

        // ...

    }

    它限定了 Sequence 中 Element 这个类型必须和 Iterator.Element 的类型一致。

    通过 where 语句可以对类型添加更多的约束,使其更严谨,避免在使用这个类型时做多余的类型判断。

    新的 Key Paths 语法

    先来看看 Swift 3 中 Key Paths 的写法:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    @objcMembers class Kid: NSObject {

        dynamic var nickname: String ""

        dynamic var age: Double = 0.0

        dynamic var friends: [Kid] = []

    }

     

    var ben = Kid(nickname: "Benji", age: 5.5)

     

    let kidsNameKeyPath = #keyPath(Kid.nickname)

     

    let name = ben.valueForKeyPath(kidsNameKeyPath)

    ben.setValue("Ben", forKeyPath: kidsNameKeyPath)

    Swift 4 中创建一个 KeyPath 用 \作为开头:

    1

    \Kid.nickname

    当编译器可以推导出类型时,可以省略基础类型部分:

    1

    \.nickname

    上面的代码在 Swift 4 中就可以这样写:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    struct Kid {

        var nickname: String ""

        var age: Double = 0.0

        var friends: [Kid] = []

    }

     

    var ben = Kid(nickname: "Benji", age: 8, friends: [])

     

    let name = ben[keyPath: \Kid.nickname]

    ben[keyPath: \Kid.nickname] = "BigBen"

    相比 Swift 3,Swift 4 的 Key Paths 具有以下优势:

    类型可以定义为 class、struct定义类型时无需加上 @objcMembers、dynamic 等关键字性能更好类型安全和类型推断,例如 ben.valueForKeyPath(kidsNameKeyPath) 返回的类型是 Any,ben[keyPath: \Kid.nickname] 直接返回 String 类型可以在所有值类型上使用

    下标支持泛型

    Swift 支持通过下标来读写容器中的数据,但是如果容器类中的数据类型定义为泛型,以前的下标语法就只能返回 Any,在取出值后需要用 as? 来转换类型。Swift 4 定义下标也可以使用泛型了。但是并不需要做转型操作。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    struct GenericDictionary {

        private var data: [Key: Value]

         

        init(data: [Key: Value]) {

            self.data = data

        }

         

        subscript(key: Key) -> T? {

            return data[key] as? T

        }

    }

     

    let dictionary = GenericDictionary(data: ["Name""Xiaoming"])

     

    let name: String? = dictionary["Name"// 不需要再写 as? String

    2、字符串

    Unicode 字符串在计算 count 时的正确性改善

    在 Unicode 中,有些字符是由几个其它字符组成的,比如 é 这个字符,它可以用 \u{E9} 来表示,也可以用 e 字符和上面一撇字符组合在一起表示 \u{65}\u{301}。

    2.png

    这个 family 是一个由多个字符组合成的字符,打印出来的结果为3.png。上面的代码在 Swift 3 中打印的 count 数是 4,在 Swift 4 中打印出的 count 是 1。

    更快的处理速度

    Swift 4 的字符串优化了底层实现,对于英语、法语、德语、西班牙语的处理速度提高了 3.5 倍。对于简体中文、日语的处理速度提高了 2.5 倍。

    去掉了characters

    One-sided Slicing

    Swift 4 新增了一个语法糖 ... 可以对字符串进行单侧边界取子串。

    4.png

    String 当做 Collection 来用

    Swift 4 中 String 可以当做 Collection 来用,并不是因为 String 实现了 Collection 协议,而是 String 本身增加了很多 Collection 协议中的方法,使得 String 在使用时看上去就是个 Collection。例如:

    翻转字符串:

    1

    2

    3

    let abc: String "abc"

    print(String(abc.reversed()))

    // cba

    遍历字符:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    let abc: String "abc"

    for in abc {

        print(c)

    }

    /*

    a

    b

    c

    */

    Map、Filter、Reduce:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    // map

    let abc: String "abc"

    _ = abc.map {

        print($0.description)

    }

     

    // filter

    let filtered = abc.filter { $0 == "b" }

     

    // reduce

    let result = abc.reduce("1") { (result, c) -> String in

        print(result)

        print(c)

        return result + String(c)

    }

    print(result)

    Substring

    在 Swift 中,String 的背后有个 Owner Object 来跟踪和管理这个 String,String 对象在内存中的存储由内存其实地址、字符数、指向 Owner Object 指针组成。Owner Object 指针指向 Owner Object 对象,Owner Object 对象持有 String Buffer。当对 String 做取子字符串操作时,子字符串的 Owner Object 指针会和原字符串指向同一个对象,因此子字符串的 Owner Object 会持有原 String 的 Buffer。当原字符串销毁时,由于原字符串的 Buffer 被子字符串的 Owner Object 持有了,原字符串 Buffer 并不会释放,造成极大的内存浪费。

    在 Swift 4 中,做取子串操作的结果是一个 Substring 类型,它无法直接赋值给需要 String 类型的地方。必须用 String() 包一层,系统会通过复制创建出一个新的字符串对象,这样原字符串在销毁时,原字符串的 Buffer 就可以完全释放了。

    1

    2

    3

    4

    5

    6

    let big = downloadHugeString()

    let small = extractTinyString(from: big)

     

    mainView.titleLabel.text = small // Swift 4 编译报错

     

    mainView.titleLabel.text = String(small) // 编译通过

    多行字符串字面量

    Swift 3 中写很长的字符串只能写在一行。

    1

    2

    3

    4

    5

    6

    7

    func tellJoke(name: String, character: Character) {

        let punchline = name.filter { $0 != character }

        let n = name.count - punchline.count

        let joke = "Q: Why does \(name) have \(n) \(character)'s in their name?\nA: I don't know, why does \(name) have \(n) \(character)'s in their name?\nQ: Because otherwise they'd be called \(punchline)."

        print(joke)

    }

    tellJoke(name: "Edward Woodward", character: "d")

    字符串中间有换行只能通过添加 \n 字符来代表换行。

    Swift 4 可以把字符串写在一对 """ 中,这样字符串就可以写成多行。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    func tellJoke(name: String, character: Character) {

        let punchline = name.filter { $0 != character }

        let n = name.count - punchline.count

        let joke = """

            Q: Why does \(name) have \(n) \(character)'s in their name?

            A: I don't know, why does \(name) have \(n) \(character)'in their name?

            Q: Because otherwise they'd be called \(punchline).

            """

        print(joke)

    }

    tellJoke(name: "Edward Woodward", character: "d")

    3、Swift 标准库

    Encoding and Decoding

    当需要将一个对象持久化时,需要把这个对象序列化,往常的做法是实现 NSCoding 协议,写过的人应该都知道实现 NSCoding 协议的代码写起来很痛苦,尤其是当属性非常多的时候。几年前有一个工具能自动生成 Objective-C 的实现 NSCoding 协议代码,当时用着还不错,但后来这个工具已经没有人维护很久了,而且不支持 Swift。

    Swift 4 中引入了 Codable 帮我们解决了这个问题。

    1

    2

    3

    4

    struct Language: Codable {

        var name: String

        var version: Int

    }

    我们想将这个 Language 对象的实例持久化,只需要让 Language 符合 Codable 协议即可,Language 中不用写别的代码。符合了 Codable 协议以后,可以选择把对象 encode 成 JSON 或者 PropertyList。

    Encode 操作如下:

    1

    2

    3

    4

    let swift = Language(name: "Swift", version: 4)

    if let encoded = try? JSONEncoder().encode(swift) {

        // 把 encoded 保存起来

    }

    Decode 操作如下:

    1

    2

    3

    if let decoded = try? JSONDecoder().decode(Language.self, from: encoded) {

        print(decoded.name)

    }

    Sequence 改进

    1

    2

    3

    4

    5

    6

    Swift 3:

     

    protocol Sequence {

        associatedtype Iterator: IteratorProtocol

        func makeIterator() -> Iterator

    }

    1

    2

    3

    4

    5

    6

    7

    Swift 4:

     

    protocol Sequence {

        associatedtype Element

        associatedtype Iterator: IteratorProtocol where Iterator.Element == Element

        func makeIterator() -> Iterator

    }

    由于 Swift 4 中的 associatedtype 支持追加 where 语句,所以 Sequence 做了这样的改进。

    Swift 4 中获取 Sequence的元素类型可以不用 Iterator.Element,而是直接取 Element。

    SubSequence 也做了修改:

    1

    2

    3

    4

    5

    protocol Sequence {

        associatedtype SubSequence: Sequence 

            where SubSequence.SubSequence == SubSequence,

                  SubSequence.Element == Element

    }

    通过 where 语句的限定,保证了类型正确,避免在使用 Sequence 时做一些不必要的类型判断。

    Collection 也有一些类似的修改。

    Protocol-oriented integers

    整数类型符合的协议有修改,新增了 FixedWidthInteger 等协议,具体的协议继承关系如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    +-------------+   +-------------+

            +------>+   Numeric   |   | Comparable  |

            |       |   (+,-,*)   |   | (==,,...)|

            |       +------------++   +---+---------+

            |                     ^       ^

    +-------+------------+        |       |

    |    SignedNumeric   |      +-+-------+-----------+

    |     (unary -)      |      |    BinaryInteger    |

    +------+-------------+      |(words,%,bitwise,...)|

           ^                    ++---+-----+----------+

           |         +-----------^   ^     ^---------------+

           |         |               |                     |

    +------+---------++    +---------+---------------+  +--+----------------+

    |  SignedInteger  |    |  FixedWidthInteger      |  |  UnsignedInteger  |

    |                 |    |(endianness,overflow,...)|  |                   |

    +---------------+-+    +-+--------------------+--+  +-+-----------------+

                    ^        ^                    ^       ^

                    |        |                    |       |

                    |        |                    |       |

                   ++--------+-+                +-+-------+-+

                   |Int family |-+              |UInt family|-+

                   +-----------+ |              +-----------+ |

                     +-----------+                +-----------+

    Dictionary and Set enhancements

    这里简单列一下 Dictionary 和 Set 增强了哪些功能:

    • 通过 Sequence 来初始化
    • 可以包含重复的 Key
    • Filter 的结果的类型和原类型一致
    • Dictionary 的 mapValues 方法
    • Dictionary 的默认值
    • Dictionary 可以分组
    • Dictionary 可以翻转

    NSNumber bridging and Numeric types

    1

    2

    let n = NSNumber(value: 999)

    let v = n as? UInt8 // Swift 4: nil, Swift 3: 231

    在 Swift 4 中,把一个值为 999 的 NSNumber 转换为 UInt8 后,能正确的返回 nil,而在 Swift 3 中会不可预料的返回 231。

    MutableCollection.swapAt(::)

    MutableCollection 现在有了一个新方法 swapAt(::) 用来交换两个位置的值,例如:

    1

    2

    3

    4

    var mutableArray = [1234]

    mutableArray.swapAt(12)

    print(mutableArray)

    // 打印结果:[1, 3, 2, 4]

    4、构建过程改进

    New Build System

    Xcode 9 引入了 New Build System,可在 Xcode 9 的 File -> Project Settings... 中选择开启。

    预编译 Bridging Headers 文件

    对于 Swift 和 Objective-C 混合的项目,Swift 调用 Objective-C 时,需要建立一个 Bridging Headers 文件,然后把 Swift 要调用的 Objective-C 类的头文件都写在里面,编译器会读取 Bridging Headers 中的头文件,然后生成一个庞大的 Swift 文件,文件内容是这些头文件内的 API 的 Swift 版本。然后编译器会在编译每一个 Swift 文件时,都要编译一遍这个庞大的 Swift 文件的内容。

    有了预编译 Bridging Headers 以后,编译器会在预编译阶段把 Bridging Headers 编译一次,然后插入到每个 Swift 文件中,这样就大大提高了编译速度。

    苹果宣称 Xcode 9 和 Swift 4 对于 Swift 和 Objective-C 混合编译的速度提高了 40%

    Indexing 可以在编译的同时进行

    用 Swift 开发项目时,近几个版本的 Xcode 进行 Indexing 的速度慢的令人发指。Xcode 9 和 Swift 4 在这方面做了优化,可以在编译的同时进行 Indexing,一般编译结束后 Indexing 也会同时完成。

    COW Existential Containers

    Swift 中有个东西叫 Existential Containers,它用来保存未知类型的值,它的内部是一个 Inline value buffer,如果 Inline value buffer 中的值占用空间很大时,这个值会被分配在堆上,然而在堆上分配内存是一个性能比较慢的操作。

    Swift 4 中为了优化性能引入了 COW Existential Containers,这里的 COW 就代表 "Copy-On-Write",当存在多个相同的值时,他们会共用 buffer 上的空间,直到某个值被修改时,这个被修改的值才会被拷贝一份并分配内存空间

    移除未调用的协议实现

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    struct Date {

        private let secondsSinceReferenceDate: Double

    }

     

    extension Date: Equatable {

        static func ==(lhs: Date, rhs: Date) -> Bool {

            return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate

        }

    }

     

    extension Date: Comparable {

        static func  Bool {

            return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate

        }

    }

    看上面例子,Date 实现了 Equatable 和 Comparable 协议。编译时如果编译器发现没有任何地方调用了对 Date 进行大小比较的方法,编译器会移除 Comparable 协议的实现,来达到减小包大小的目的。

    减少隐式 @objc 自动推断

    在项目中想把 Swift 写的 API 暴露给 Objective-C 调用,需要增加 @objc。在 Swift 3 中,编译器会在很多地方为我们隐式的加上 @objc,例如当一个类继承于 NSObject,那么这个类的所有方法都会被隐式的加上 @objc。

    1

    2

    3

    4

    class MyClass: NSObject {

        func print() { ... } // 包含隐式的 @objc

        func show() { ... } // 包含隐式的 @objc

    }

    这样很多并不需要暴露给 Objective-C 也被加上了 @objc。大量 @objc 会导致二进制文件大小的增加。

    在 Swift 4 中,隐式 @objc 自动推断只会发生在很少的当必须要使用 @objc 的情况,比如:

    复写父类的 Objective-C 方法符合一个 Objective-C 的协议其它大多数地方必须手工显示的加上 @objc。

    减少了隐式 @objc 自动推断后,Apple Music app 的包大小减少了 5.7%。

    5、 Exclusive Access to Memory

    在遍历一个 Collection 的时候可以去修改每一个元素的值,但是在遍历时如果去添加或删除一个元素就可能会引起 Crash。

    例如为 MutableCollection 扩展一个 modifyEach 方法来修改每个元素的值,代码如下:

    1

    2

    3

    4

    5

    6

    7

    extension MutableCollection {

        mutating func modifyEach(_ body: (inout Element) -> ()) {

            for index in self.indices {

                body(&self[index])

            }

        }

    }

    假如在调用 modifyEach 时去删除元素:

    1

    2

    3

    4

    5

    var numbers = [123]

    numbers.modifyEach { element in

        element *= 2

        numbers.removeAll()

    }

    就会在运行时 Crash。Swift 4 中引入了 Exclusive Access to Memory,使得这个错误可以在编译时被检查出来。

    展开全文
  • swift 框架大全

    2017-06-26 11:27:09
    版本:Swift github排名 https://github.com/trending,github搜索:https://github.com/search 主要工作说明:  1. 将Swift从Objective-C混合的md文件中抽出(正在进行…) 使用方法:根据目录关键字...

    版本:Swift

    github排名 https://github.com/trending,github搜索:https://github.com/search

    主要工作说明: 
    1. 将Swift从Objective-C混合的md文件中抽出(正在进行…)

    使用方法:根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性。

    问题反馈:请广大网友只按照目录结构(即使目录结构有问题)添加三方库,并pull request。目录问题大家提出issues后楼主会及时更改的。

    目录

    ========

    具体内容 =============================

    ========

    Swift学习资料@

    下拉刷新@

    • ZLSwiftRefresh - swift下拉刷新/上拉加载更多,支持自定义动画,集成简单,兼容UITableView/CollectionView/ScrollView/WebView。
    • BreakOutToRefresh - swift,上拉和下拉刷新。
    • GearRefreshControl - swift,上拉和下拉刷新。
    • refresher - swift,上拉和下拉刷新。
    • ReplaceAnimation.swift - 基于 @ZeeYoung欧阳哲 同学的创意下拉刷新动画实现。值得称赞还有额外增加了“取消及滚动”效果支持。
    • PullToReflesh-Swift - 一款炫酷的下拉刷新封装库(Mobile page refresh concept inspired by Google and for something like a news app)。源码分析 
    • pull-to-refresh.swift - 是一款非常易于开发者使用的下拉刷新和加载更多组件。通过一个 UIScrollView 的扩展,可以轻松为 UIScrollView 的所有子类添加下拉刷新功能。
    模糊效果@
    AutoLayout@
    • Snap - Snap是Masonry Auto Layout DSL的Swift版本,是一款轻量级的布局框架,使用了更良好的语法封装了AutoLayout。Snap支持iOS和OS X。
    • Neon.swift - 功能强大的 UI 布局神器。
    • EasyPeasy.swift - 编程方式自动布局框架库。
    富文本@
    • RichEditorView - swift,一套可定制富文本编辑器组件及示例。功能完整、代码简练、实现逻辑巧妙(编辑器核心与 WebView 结合,采用 HTML5 contentEditable 编辑模式,执行JS 配套命令 execCommand 实现富文本编辑功能)。
    • SwiftyMarkdown.swift - 用swift写的markdown解析库。
    • Marklight.swift - Markdown 语法高亮显示编辑库(Swift)。
    • LTMorphingLabel - swift 能够实现文字变形动画效果的Label,用Swift写的一个能够实现文字变形动画效果的Label,很炫。
    • Splitflap.swift - 可用于快速给 iOS 应用创建文字翻转的动画效果。
    • FloatLabelFields.swift - FloatLabelFields.swift浮动标签输入效果类。
    • cleartext-mac.swift - 提供一千个常用单词的编辑器。
    • GlitchLabel.swift - 可定制“黑(故障)文字标签”类库,熟称晃瞎你的眼文字标签。
    图表@
    • swift-linechart - 功能完整、实用的折线图组件。使用方便,参数配置简单。是不可多得的优质组件–swift。
    • ios-charts - 一款优秀 Android 图表开源库 MPAndroidChart 的 Swift 语言实现版(支持 Objective-C 和 Swift 调用)。缺省提供的示例代码为 Objective-C。
    • Scrollable-GraphView.swift - 灵动感十足的自适应、可定制滚动曲(折)线图表库。
    表相关、TabbleView、Tabbar、即时聊天界面@
    • Eureka.swift - Eureka 是 XLForm 的 Swift 的移植版本, 一个可以帮助开发者们快速构建 iOS 各种复杂表单的库, 具有较高的可扩展性, 方便自定制样式。
    • HBHorizontalTableView - swift,TableView 横向滚动小示例(仿照 AppStore 应用展示)。
    • Chats - 聊天 UI 示例程序。此项目应该只为演示或学习之用,没有服务器 – swift。
    • Chatto.swift - Chatto.swift:轻量级聊天应用框架及示例。文字及图片可扩展输入栏,汽泡效果等聊天核心特性,分页及自动布局完善。
    • COBezierTableView - swift,通过编辑 Bezier 曲线四点位置设置 TableView 内 Cell 及对应按扭位置。实验效果很赞。
    • LxTabBarController - 改变了原生tabbar切换tab时的生硬效果,并加入滑动切换手势(有和界面上的其它手势发生冲突的风险,可根据具体项目予以关闭),swift版本
    • Sapporo - swift 单元格模型驱动的集合视图管理器组件。又一个超实用的“轮子”。
    • NavTopImage.swift - NavigationController动态缩放titleView。
    • paper-onboarding.swift - 漂亮的 material design 风格页面滑块。示例完整,易用。
    • Material.swift - 基于 Material Design 动画和图像框架库 (作者 Daniel Dahan)。
    • ReorderableGridView-Swift - 拖拽排序卡片。
    • ZYThumbnailTableView.swift - 可展开型预览TableView,开放接口,完全自由定制。实现教程
    • WHC_CollectionViewFramework.swift - 高仿支付宝可拖拽排序编辑动画效果cell的CollectionView集合视图。
    • SwipeViewController.swift - 一款好用的页面滑动和标签选项卡类库及示例。功能相当于 Objective-C 版 RKSwipeBetweenViewControllers。
    • TabDrawer.swift - 更适合单手操作的可定制 Tab Bar 组件库。P.S. 自动布局选择了 EasyPeasy。
    • SFFocusViewLayout.swift - UICollectionViewLayout实现的图片浏览器。
    • ESTabBarController.swift - 自定义TabBarController组件,继承自UITabBarControlle,可添加动画和自定义样式。swift 高度自定义TabBarController,支持自定义TabBarItem样式或添加动画
    隐藏与显示@
    HUD与Toast@
    • Toast-Swift - 高可定制易用的 Toast 弹出信息或通知用户界面组件类。
    对话框@
    • SwiftyDrop - 轻量、易用的小清新弹出列表及信息提示组件真心不错。
    • PCLBlurEffectAlert.swift - 细节定制较丰富的弹出警报窗口组件。
    • GSAlert.swftt - 苹果在iOS8推出了全新的UIAlertController,旧的UIAlertView和UIActionSheet渐渐被废弃,但如果你仍然支持iOS7系统,你将不得不写两套代码。GSAlert解决了这个问题。
    • TKSwarmAlert.swift - TKSwarmAlert.swift:模仿 Swarm app 的 Alert 提醒框动画工具。
    • PMAlertController.Swift - 可定制弹窗组件替代官版不可定制的 UIAlertController。
    • TBActionSheet.swift - 支持Carthage,可自定义度100%的 ActionSheet,支持微信样式。
    状态栏@
    导航栏@
    设置@
    Switch@
    日历@
    • FSCalendar 一个包含objective-c和Swift版本的优秀的日历
    其他UI@
    • KDCircularProgress - KDCircularProgress是使用swift制作的色彩炫丽的进度条,可以加入多种颜色来控制进度条的渐变效果。
    • RandomColorSwift - 一个自动生成好看的颜色的 Swift 库,RandomColorSwift。
    • Hue.Swift - Hue.Swift:颜色常规功能集于一身的定义、使用 Color 工具类库(含图片取色)。
    • KtColor.swift - 利用 Swift 的语法特性简化创建 UIColor对象的过程。具体文章可以参考博客:当UIColor遇上 Swift
    • YPDropMenuViewDemo.swift - 一款DropMenu,menuView,类似之前美团的下拉菜单,支持swift2.2,因为用到iOS8.的毛玻璃。所以想支持到iOS8.0,支持自定义,支持等宽排列,支持从左向右排列。
    • ZMaterialDesignUIButton - Swift Material Design UIButton。
    • Twinkle - 为字体加上钻石版闪耀的效果。使用Swift编写。
    • Persei - 非常赞 动画隐藏或显示顶部菜单支持库及示例项目。–swift
    • DateRangePicker.swift - 可能是目前最好的 OS X 日期选择器,高扩展性,界面风格看起来很舒服,不过注意,是 OS X 开发专用。
    • SwiftyFORM - swift 表单输入框架(亮点是表单验证规则引擎),是我见过地最易用的 Swift 表单组件。
    • SwiftSpinner - SwiftSpinner是使用swift制作的一款精致带感的指示器,并且连带有字体信息显示,模糊背景,半透明,扁平化等IOS8的效果。
    • AKPickerView-Swift - 一款小而美的 3D 效果选择器。
    • iOS-RatingBar - iOS-RatingBar swift版的评分控件,跟Android的RatingBar一样有两种模式,评分模式和只读模式’支持视图编辑,自定义星星数量,评分等级,另外还能支持非整数星,0.5颗星,0.1颗星,可以开启动画效果。
    • LxGridView-oc LxGridView-swift - 利用UICollectionView模仿iOS系统桌面图标的交互,作用如动图。
    • GMStepper - swift 带动画效果、支持手势滑动操作的步进标签。
    • LayoutTrait - swift 一个小类库。 做iPad 多任务分屏 适配的同学可以看一下。
    • BTNavigationDropdownMenu - 下拉列表暨导航标题组件。简单、直接、易用 -swift。
    • InceptionTouch.swift - 让没有 3D Touch 设备也有类似交互体验的 InceptionTouch 类(基于 UITextView 实现,支持日期,链接,电话号码,地址触摸响应)。
    • TWControls.swift - 简单的开关和按钮控制器,使用闭包来执行由控件触发的操作。
    • Instructions.swift - 可定制嵌入式操作指引框架及演示。
    • SMSegmentView.swift - 高可定制化,既支持横向,也支持纵向布局的图文 Segment Control 组件,节选器。
    • Gecco.Swift - Gecco.Swift 是一款支持对视图进行局部高亮的 Swift 库, 帮助 iOS 开发者快速创建产品的新手指导界面。
    • SubtleVolume.swift - 更隐蔽的系统音量替代指示器。
    • InkKit.swift - 该类库帮助开发者绘制简单图形更容易。
    • SwiftSVG - 支持多种接口(String, NS/UIBezierPath, CAShapeLayer, and NS/UIView)绘制 SVG 类库。
    • LeeGo.swift - 带来更 声明式的,可配置的和易复用的UI开发方式,让UI开发变得像玩乐高积木一样简单直观,某种程度上取代ComponentKit。用 struct 和 enum 来构建你的整套 UI
    • Caishen.swift - 简易、实用的付款输入及校验 UI 组件。

    • StackViewController - 方便 iOS 开发者使用 UIStackView 构建表单或其它静态内容视图。

    • LLBootstrapButton - Bootstrap 3.0扁平化风格按钮,自带图标,一句代码直接调用!
    • JMRoundedCorner - UIView设置不触发离屏渲染的圆角!

    其他UI@

    ========

    动画@

    游戏@
    侧滑与右滑返回手势@
    • SideMenu - swift实现,一款带动画效果可定制 Slide Menu,可以学习其动画实现思路。P.S. 对于Hamburger式菜单,虽然很常用,不过,苹果并不鼓励使用,甚至有开发小组对其弊病用自家上线应用前后数据对比进行了抨击。
    • QQConfiguration - swift,QQ-iPhone端框架,左侧菜单栏拖动手势。
    • SwiftPages - 高可定制类似 Instagram 视图滑动切换功能类库。API 简单、易用。
    • FlowingMenu.swift - 菜单如此出场方式(橡皮筋弹跳式动画)好玩又有趣。
    gif动画@
    • YLGIFImage-Swift - YLGIFImage-Swift。
    • gifu.Swift - gifu.Swift高性能GIF显示类库。
    • droptogif - droptogif视频拖拽到应用窗口后自动转换为 GIF 动画(其转换进程动画效果也超赞)。
    • JWAnimatedImage.swift - JWAnimatedImage.swift集中了目前主流的 GIF 显示库(如 FLAnimatedImage,Gifu 等)的优点,进行重构,代码短小精悍。而且使用了新的 frame 提取算法。
    • SwiftyGif - 高性能 Gif 播放引擎。
    • PHImageKit.swift - 出自 Product Hunter 开发小组的带下载、缓存的 GIF 播放组件库。使用简单又方便。
    其他动画@
    • popping - popping是一个POP 使用实例工程
    • PopMenu - 用POP动画引擎写的Sina微博的Menu菜单。
    • MZGuidePages - 自己写的通用导航页,可以直接引入工程使用,请参考案例(版本新特性、导航页、引导页)。
    • Wizardry.swift - 可重用的方法和框架实现向导式用户界面管理。(版本新特性、导航页、引导页)。
    • Spring - Spring是一个Swift编写的开源库,可简化Swift编写的iOS动画。支持shake、pop、morph、squeeze、wobble、swing、flipX、flipY、fall、squeezeLeft、squeezeRight以及squeezeDown等多种动画形式,用 IBDesignable 让使用者可以在 Xcode 中快速设置动画效果。
    • JGTransitionCollectionView - swift,基于集合视图扩展实现完成自动布局及单元项 Flip式动画效果(效果很赞)。组件使用方便、自然(只需设置集合视图数据源的标准方式即可)。
    • KYShareMenu - 带弹性动画的分享菜单。
    • BuildAnInfiniteCarousel - 自己动手造无限循环图片轮播,教程
    • tispr-card-stack - swift 卡片风格动画切换组件及完整交互示例。
    • ZLSwipeableViewSwift - swift 卡片堆叠效果的实现(ZLSwipeableView)】可实现类似Tinder和Potluck应用程序的卡片堆叠效果,该项目基于ZLSwipeableView objective-c实现。1.自定义动画。2.自定义滑动切换。3.自定义方向。4.撤销。
    • Koloda - 基于卡片的 Tinder-style 动画效果示例。精细绝人。更赞的是额外附了详细开发教程 How We Built Tinder-Like Koloda Animation in Swift 网页链接 。Yalantis 出品动画程序款款精品。
    • KDIntroView - swift 动态介绍视图框架及演示。另外两个相似的类库是 RazzleDazzle和 Presentation,择需使用。
    • RazzleDazzle - 【IFTTT开源Swift编写的帧动画框架–RazzleDazzle】RazzleDazzle 是IFTTT开源的一个iOS帧动画框架,非常适用于APP初次使用时的介绍和引导信息。JazzHands是UIKit一个简单的关键帧基础动画框架,可通过手势、scrollview、KVO等控制动画,被IFTTT应用在IFTTT for iPhone上。
    • SIFloatingCollection_Swift - 可定制的 Apple Music 风格浮动形状动画组件及演示。
    • CKWaveCollectionViewTransition - swift, UICollectionViewController之间切换的动画。
    • CardsAnimationDemo - swift, 《使用 UICollectionView 实现的一个卡片动画》不是直接操作所有 UIView 和 CALayer 的 transform3D 属性来实现整个效果的,而是使用 UICollectionView 来完成所有的视图管理和实现。
    • TKRubberIndicator.swift - 一个很不错的 page control。
    • TTGEmojiRate.swift - TTGEmojiRate.swift以Emoji表情为基础绘图,Swift开源项目: TTGEmojiRate的实现
    • CardAnimation.swift - CardAnimation 是国人开发的一个用 Swift 实现卡片垂直翻转动画的 Demo, 实现思路
    • CoreAnimationCode.swift - 提供了 “iOS Core Animation Advanced Techniques” 书籍中的代码实例, 方便开发者们进行参考学习。
    • UIViewXXYBoom.swift - 一个炫酷好玩的爆炸效果,如何实现这个效果
    • ZLSwipeableViewSwift - ZLSwipeableView - ZLSwipeableViewSwift在Tinder and Potluck中的动画效果实现思路(连续卡片翻页效果),最贴心的是作者提供了OC和Swift两个版本来供开发者使用,非常丝滑顺畅的效果。
    • RYCuteView - 用UIBezierPath实现果冻效果。 教程
    • IBAnimatable.swift - 第三方开源库IBAnimatable可以帮助我们在Interface Builder和Swift Playground里面设计UI, 交互, 导航模式, 换场和动画。整个App 都是通过 IBAnimatable 在Interface Builder 设计完成,没有任何一行代码。
    • MotionMachine.swift - 功能强大、优雅、模块化动画库。
    • circle-menu.swift - 动画效率很赞的圆形缩放菜单演示及类库。
    • BWWalkthrough.swift - BWWalkthrough.swift界面切换中加入灵动的动画效果。
    • hamburger-button.swift - hamburger-button.swift一个汉堡包动画关闭按钮。
    • HamburgerButton.swift - HamburgerButton.swift一个汉堡包动画返回按钮。
    • MDCSwipeToChooseView - MDCSwipeToChooseView翻牌子效果。
    • Advance.swift - 简单易用、功能强大的动画框架库。在手势交互、帧动画、自定义动画及仿真类型将是不错的选择。
    • HWAnimationTransition_Swift 、HWAnimationTransition_OC - 类似于格瓦拉启动页中的放大转场动画(objective-C && Swift)。教程
    • NumberMorphView.swift - 可爱的数字补间(变身)动画类库。
    • DisplaySwitcher.swift - 两个集合视图在不同布局(平铺和列表)间平滑切换。Yalantis 出品。
    • DynamicButton.swift - 一套完整、且带动画过渡的图标按钮库。
    • TKDotSegment.swift - 是一个带有圆点动画的 segment。
    • LiquidLoader.swift - 液态加载动画的轻量级 UI 组件。
    • 15DaysofAnimationsinSwift - 15DaysofAnimationsinSwift动画。
    • Interpolate.swift - 手势驱动交互式转场动画框架库。这个很专业,且非常有意思。
    • PeekPop.swift - 3DTouch动画组件。
    • fantastic-ios-animation.swift - 基于 UI 组件类别分类,且带精彩动画效果的 iOS 组件库集合。
    • GridPanelDemo 赞,一个点击翻转的动画Demo

    ========

    网络@

    网络连接@
    • Alamofire - Alamofire是AFNetworking的作者mattt新写的网络请求的swift库。Alamofire 最佳实践
    • SwiftRouter - A URL Router for iOS, written in Swift 2.2 :large_orange_diamond:
    • AlamofireObjectMapper.swift - 将Alamofire JSON响应数据 转为swift对象。
    • RxAlamofire.swift - 为Alamofire提供函数响应式(FRP)调用接口,以优雅的方式使用Alamofire进行网络请求。
    • socket.io-client-swift - WebSockect 客户端类库。开放的通讯协议,有利于构建强大地跨平台应用。
    • Transporter - swift, 短小、精悍、易用的多文件(并发或顺序)上传和下载传输库。还支持后台运行、传输进程跟踪、暂停/续传/取消/重试控制等功能。
    • Just - 小而美的 HTTP 类。功能简单、直接、完整且健壮性高– swift。
    • Future - 基于微框架设计思想的异步执行及结果响应类,代码即简单又干净– swift。
    • HFDownLoad - iOS开发网络篇之文件下载、大文件下载、断点下载:NSData方式、NSURLConnection方式、NSURLSession下载方式 下载方式具体的思路、区别见Blog 。
    • Pitaya.swift - Pitaya 是纯 Swift 写的 iOS 网络库,支持 Basic Authorization、SSL 钢钉、HTTP raw body / JSON body、快速文件上传等特性,并通过内置 JSONNeverDie 实现了对 JSON 的完全支持,开箱即用。 中文文档
    • starscream.swift - starscream.swift:WebSocket客户端类库。
    • SwiftNet.swift - 基于 RxSwift 和 Alamofire 的网络请求简易封装库。
    • Networking.Swift - 使用简单、功能惊喜,基于 NSURLSession 的网络封装。
    图像获取@
    • Kingfisher - 纯 Swift 实现的类 SDWebImage 库,实现了异步下载和缓存图片。
    • KFSwiftImageLoader - Swift,一个图像缓存加载库。
    图像获取@
    • Kingfisher 一个用于图片缓存的开源库,类似 SDWebImage,但是完全基于 Swift 语言开发。
    网络聊天@
    • MessageKit.swift - 消息 UI 库 JSQMessagesViewController 的 Swift 版。
    • jchat-swift - 一个聊天 App,具有完备的即时通讯功能,JChat 的功能基于极光 JMessage SDK 来开发。
    网络测试@
    • Reachability.swift - 用于替换苹果的 Reachability 类,可以方便地检测当前是否联网以及具体的联网状态。
    • NetReachability - swift2.0 简单的方法检查网络连接的连通性,提供通知中心集成接口。
    • SimpleBS.swift - 网络测试小工具。
    网页框架@
    • Perfect.swift - Perfect 致力于 Swift 服务端应用,从打造专业应用服务器开始。Swift服务端编程:Perfect项目上手指南
    • swift-http - Swift HTTP Server,又一个 Swift 服务器,最大的亮点是支持 Docker 部署。
    • Swifton - Swifton是一个优秀的Swift on Rails 的Web Framework。
    • Taylor.swift - Taylor一个swift的轻量级的http服务器的库。
    • NetworkObjects.swift - NetworkObjects.swift轻量版HttpServer框架,跨平台解决方案。
    • vapor.swift - vapor.swift:swift的服务器库 vapor。
    • Kitura.swift - Kitura.swift:安装、使用步骤及文档最为清晰地来自 IBM Swift 开发组的开源 Web 服务器。此外,IBM 云服务 Bluemix 也为 Swift 打开通路。
    CSV@
    • CSwiftV - A csv parser written in swift conforming to rfc4180 :large_orange_diamond:
    • SwiftCSV - CSV parser for Swift :large_orange_diamond:
    WebView与WKWebView@

    Json@

    • ObjectMapper - 很赞 ObjectMapper 是一个基于 Swift 语言开发的能够让 JSON 与 Object 之间轻易转换的类库。通过 ObjectMapper 我们可以将 JSON 数据转换成 Model 对象或将 Model 对象转换成 JSON 数据。 Simple JSON Object mapping written in Swift
    • Decodable - Swift 2 JSON parsing done (more) right :large_orange_diamond:
    • Jay - Pure-Swift JSON parser & formatter. Linux & OS X ready. :large_orange_diamond:
    • SwiftyJSON - The better way to deal with JSON data in Swift. :large_orange_diamond:
    • XMLDictionary - ios与mac os平台下xml与NSDictionary相互转化开源类库。
    • AEXML.swift - AEXML.swift简单又易于的XML解析类及示例。
    • CFRuntime - “Swift 版的 MJExtension,运行时、反射与一键字典模型互转”。
    • protobuf-swift - Protocol Buffers 的 Swift 语言实现库。P.S. Protocol Buffers 是 Google 开源项目,主要功能是实现直接序列化结构化的对象数据,方便跨平台快速传递,开发者也可以直接修改 protobuf 中的数据。相比 XML 和 JSON,protobuf 解析更快,存储更小。
    • JSONCodable - 基于 Swift 2.0 新特性(Protocol Extensions and Error Handling)的JSON 解析类。
    • SwiftyJSON - 使Swift的JSON解析变得简单。
    • JSONNeverDie.swift - JSON 到 Model 类的自动映射工具。
    • Fuzi.swift - Swift实现的轻量快速的 XML/HTML 解析器。
    • SWXMLHash.swift - 易用的 XML 解析类库。非常实用的“轮子”。
    • YYModel - 高性能的 iOS JSON 模型框架。
    • TidyJSON.swift - TidyJSON.swift一款简单、易用、明了的 JSON 解析小类库。
    • PMJSON.swift - PMJSON.swift简单、实用、高效的 JSON 解析类库。
    • Unbox.swift - 极为易用、轻量,更少辅助代码的 JSON 解析类。
    • Wrap.swift - 方便、易用的对象转 JSON 类库。
    • JASON - 高效的Json解析(Swift) Fast JSON parsing for Swift
    • JSONCodable - Swift json编码解码三方库 Hassle-free JSON encoding and decoding in Swift
    • Coolie - Swift json转model的三方库 Coolie helps you to create models (& their constructors) from JSON file.
    • Tailor - 一个非常快和方便的对象映射Swift三方库 A super fast & convenient object mapper tailored for your needs.
    • alexander - 一个非常简洁的json处理三方库 An extremely simple JSON helper written in Swift.
    • Freddy - 一个可以重用的json解析库 A reusable framework for parsing JSON in Swift.
    • mapper - 一个json反序列化库 A JSON deserialization library for Swift
    • AlamofireJsonToObjects - 一个将json data转为Swift对象的类扩展 An Alamofire extension which converts JSON response data into swift objects using EVReflection
    • Alembic - 功能性的json解析库 Functional JSON parsing, mapping to objects, and serialize to JSON :large_orange_diamond:
    • Wrap - The easy to use Swift JSON encoder :large_orange_diamond:
    • Arrow - 一个Swift JSON解析库 JSON Parsing Library for Swift
    • Genome - 一个易用、多样、安全,包含错误映射的JSON转Model的Swift库. A simple, type safe, failure driven mapping library for serializing JSON to models in Swift 2.0 (Supports Linux)

    通讯录@

    • PPGetAddressBookSwift - 一行代码获取按A~Z分组精准排序的通讯录联系人 Swift版( 已处理姓名所有字符的排序问题)

    Email@

    • Postal A swift framework for working with emails,Postal is a swift framework providing simple access to common email providers.

    三方分享、支付、登录等等@

    其他库@

    • SwiftDate - 特别完整、强大的日期时间操作管理类库。它几乎涵盖了已知开源日期类库所有优秀特性。 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。
    • SYKeyboardTextField - SYKeyboardTextField 是一个轻巧,简单,非侵入式的键盘附随输入框! 采用Swift编写。
    • IQKeyboardManager - 处理键盘事件强大的库,有OC和Swift版本,纯代码、Storyboard和Xib都适用。
    • ZFScan - 仿微信 二维码/条形码 扫描。
    • QRCodeReader.swift - QRCodeReader.swift一款简单的 QR 二维码阅读组件及示例,提供前后相机切换功能。
    • swiftScan - 具有丰富功能的二维码扫描组件及类库。对应OC版本LBXScan
    • QR-Code-Generator.swift - 生成二维码。
    • Parsimmon - swift,小而美的语言学类库封装工具包。提供分词、标记词性、词形归并、朴素贝页斯分类、决策树等自然语言分析小工具。P.S. 英语分词效果好于中文,感兴趣的同学可以针对中文做一些优化开发。参考译文 NSHipster - NSLinguistic​Tagger
    • MKMapView-Extension - 这是关于 MKMapView 写的一个基于swift的扩展,可以扩展 MKMapView 的相关功能,减少复用代码量。
    • SwiftValidator - 基于规则的输入验证类库。项目良好的面向对象设计思想,使规则的扩展及自定义非常方便。更专业的规则引擎(甚至是基于自然语言的规则配置)解决方案,比如:开源的 Drools,商用的 ILOG 等。
    • Validated.swift - Validated.swift通过值验证或限定,快速定义新类型的微类库(约50行代码)。
    • SwiftOCR - 识别字母和数字相较于 Tesseract 有压倒性优势(附图)的 OCR 类库。
    • Regex.swift - 实用的正则表达式微框架类库。
    • PySwiftyRegex.swift - 像Python一样简洁高效地作正则处理。
    • PhoneNumberKit.swift - 解析、格式化及验证国际电话号码工具库(相当于 Google 的 libphonenumber 库的 Swift 版本)。
    • BFKit-Swift - BFKit-Swift 这套工具库可以提高应用开发效率。
    • SwiftSequence - 简洁、灵活、多变的操作 SequenceType 的类库(基于微框架(μframework)设计思想)。
    • IDNFeedParser - 一个简单易用的Rss解析库。
    • Swifternalization - 一套实用的本地化工具库。使用教程及 API 文档完整。值得收入项目的“轮子”。
    • Localize-Swift - Localize-Swift一款开发者不可或缺的国际化及本地化字符串框架支持类库。同样地,使用简单、直观又方便。
    • apous - 一款有趣的 Swift 应用 - 让 Swift 成为脚本语言。
    • ControlOrientation - 如何用代码控制以不同屏幕方向打开新页面【iOS】, 使用说明
    • SwiftyStoreKit - 一款轻量级的 iOS 应用内购买框架。
    • Device-swift - 可以非常方便的获取设备型号和屏幕尺寸,实现起来难度不大,大家可以学习一下源码。
    • RunKit.swift - 针对 GCD 框架的一个友好访问封装库(支持方法链式调用)。
    • Plum-O-Meter - swift 称重应用, (3D Touch之我见)[http://swift.gg/2015/10/23/3d-touch-impressions-and-thoughts/]
    • 打开自带地图、百度地图、腾讯地图 - 打开自带地图、百度地图、腾讯地图。
    • MapManager.swift - MapManager.swift地图及路径管理封装库。
    • eviltransform.swift - eviltransform.swift解决国内GPS地图坐标偏移问题,它将政府加密过的GCJ-02坐标,转成世界通用的WGS-84坐标。
    • BabyBluetooth - 是一个非常容易使用的蓝牙库, 适用于 iOS 和 Mac OS, 基于原生 CoreBluetooth 框架封装, 可以帮开发者们更简单地使用 CoreBluetooth API, 使用链式方法体, 使得代码更简洁、优雅。iOS蓝牙开发(四):BabyBluetooth蓝牙库介绍
    • RxBluetoothKit.swift - 基于 RxSwift 的蓝牙通讯库。
    • BluetoothKit.swift - 基于 CoreBluetooth API 实现iOS/OS X 设备间蓝牙通讯封装类库。功能强大、传输稳定,示例完整,很酷。
    • CoreDataStack.swift - 存储栈。
    • SYNQueue.swift - 执行队列类库。
    • DDMathParser.swift - 相比 NSExpression 和 GCMathPaser,功能更强大的数学表达式解析器。
    • RateLimit.swift - 简单、实用定时执行任务工具类库。
    • shoppingCart.swift - swift的购物车demo,采用纯代码UI,autolayout自动布局,core animation动画效果。
    • SwiftyGPIO - 通过 Swift 语言去控制基于 Linux 主板(比如:C.H.I.P. 和 树莓派) 的 GPIO(General Purpose Input Output ),去完成简单的工控功能(比如 LED 灯的显示)。
    • Scale.swifty - 简单直观的单位计算及换算类库(支持常用计量类型)。代码简洁性、直观性杠杠的。
    • swift-pons - 面向协议的不受长度限制数字类型及数学计算扩充类库。用它做一款最牛科学计算器妥妥地。
    • SwiftString - SwiftString:String 扩展功能很丰富(无论格式化杂乱字符串,还是子串查找,亦或是格式转换都很强大)。
    • FileBrowser.swift - FileBrowser.swift 一款开源的 iOS 文件浏览器, 支持文件搜索, 文件预览和 3D touch 功能。
    • AFBrushBoard.swift - AFBrushBoard.swift基于swift的毛笔画板Demo。包含多阶贝塞尔曲线的抽取、模拟画笔速度等算法。
    • SwiftForms - SwiftForms表单递交库,快速开发利器。
    • Design-Patterns-In-Swift - Design-Patterns-In-Swift如何使用常用设计模式及示例。
    • Dollar.swift - Dollar.swift是一个Swift库,无需扩展任何内置对象就为Swift语言提供有效的函数式编程辅助方法,类似于Lo-Dash或JavaScript中的Underscore。而Cent则是通过扩展功能来扩展Swift中的特定对象类型。
    • Underscore.swift - 函数式编程辅助方法,可靠性上压倒目标对手是 Dollar。
    • PathKit.swift - PathKit.swift小而美的路径管理类。
    • Surge.swift - Surge.swift基于苹果Accelerate高性能计算数学框架封装库。
    • Async.swift - Async.swift简洁的后台执行代码的异步封装库。
    • AlecrimAsyncKit.swift - 一款很优雅的异步执行框架库。
    • BrightFutures.swift - BrightFutures.swift漫长或复杂计算由独立线程异步来完成。
    • Euler.swift - Euler.swift直观、简洁的数学表达式∛27÷3+∑[3,1,2]。
    • Siren.swift - Siren.swift当应用更新时,通知用户并提供App Store链接。
    • BTree.swift - BTree.swift:相对于标准集合类型具有更优执行性能的基于B-Tree的优化集合类型实现类库。
    • PromiseKit - 同时支持 Swift 及 Objective-C 的 Promise 类库,异步编程类库 提供了很多实用的异步函数 让异步编程更简单。
    • Duration.swift - 测量代码片段执行时间工具类库(Swift)。
    • Bolts-Swift - 全平台(所有支持 Swift 的设备)任务管理 futures/promises 异步实现类库。
    • BCColor.swift - 轻量而强大的颜色处理库,纯 Swift 版。 支持从图片拾取一套主题色,类似AppleMusic;支持图片黑白化、对颜色的加深和变浅、生成渐变颜色等。
    • AIToolbox.swift - AI 主流模块集工具箱库。其中涉及 AI 知识实在广阔又高端。
    • EZSwiftExtensions - 对Swift标准库, Foundation, UIKit 提供了很多高级扩展函数。
    • TempiBeatDetection.swift - Swift 语言写的音乐节奏节拍检测库。
    • Venice.swift - 让 Swift 3 提前支持协程(Coroutine)。P.S. Chris 曾答疑过,Coroutine 不在 Swift 3 支持范围中,将在更晚时候讨论语言级支持。
    • FlatBuffersSwift - Swift 版 FlatBuffers 实现类库。P.S. FlatBuffers 是跨平台、高效,提供了 C++/Java 接口的序列化开源工具库。
    • Lyft.swift - 一套面向 Lyft 开发者的 Swift API 类库。
    • Up-Down.swift - Up-Down.swift:在 OS X 菜单栏上实时显示网络上传和下载速度小工具。
    • Algorithm.swift - 算法和概率模型工具集。(作者 Daniel Dahan)
    • Spots.swift - 一套为了加速开发效率、将 view models 采用 JSON 格式存储于云端 view controller 框架库。
    • PinpointKit.swift - 简单的手势动作快速触发反馈组件。主要功能包含自动截屏、附加说明和日志。支持添加可定制箭头、着重框、文本、模糊打码等常用快照编辑功能。它非常适合开发过程中测试人员反馈缺陷。
    • Switcher.swift - 一个 OS X 小 App,可以很轻松地切换 App Store 和 iTunes 的账号,对于同时使用多个 Apple ID 的人来说非常地方便。
    数据存储@

    缓存处理@

    • Cache.swift - 一款简单、易用的缓存库。支持 MemoryCache, DiskCache 以及前两项组合的 MultiCache。
    • Cache.swift - Nothing but Cache。
    • AwesomeCache.swift - Delightful on-disk cache (written in Swift)。
    • Track.swift - 基于文件系统和链表的 Cache。分为 Disk 和 Memory,线程安全,支持 LRU 淘汰,性能尚可。

    CoreData@

    数据库@

    • RealmIncrementalStore.swift - RealmIncrementalStore.swift:集 Realm 数据库和 CoreData 对象模型两者优势的 Realm 数据库访问类库。
    • Breeze - 用Swift写的一个轻量级的CoreData管理工具,并且还支持iCloud 。
    • AlecrimCoreData - Swift,更容易地访问 CoreData 对象封装类库。除了 CRUD,还提供指针定位,强大的排序、筛选,异步数据获取,以及独立线程后台存取数据。
    • SQLite.swift - 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。
    • fluent.swift - 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。
    • swiftydb - 是一个第三方 SQLite 工具,能够大大简化数据库操作。如果你不放心 Realm,那就用 SwiftyDB 吧。使用教程demo
    • Graph.swift - 设计新颖、使用简单基于 Core Data 的数据驱动框架库 (作者Daniel Dahan)。
    • SwiftStore - Key-Value store for Swift backed by LevelDB :large_orange_diamond:

    PDF@

    图像浏览及处理@

    • ShinpuruImage - Syntactic Sugar for Accelerate/vImage and Core Image Filters :large_orange_diamond:
    • core-image-explorer - Core Image 滤镜处理图片– swift ,Core Image 介绍
    • GPUImage2.swift - Swift 版基于 GPU 图像和视频处理框架库。
    • TimingFunctionEditor - TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器。 Carthage ,而非常用的 CocoaPods。Carthage介绍中文
    • AAFaceDetection - AAFaceDetection–swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。
    • Concorde - swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。
    • ZoomTransition - swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。
    • AFImageHelper - swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。
    • PinterestSwift - swift,Pinterest 风格图片缩放、切换示例。
    • PhotoStackView-Swift - PhotoStackView——照片叠放视图,使用说明
    • MPParallaxView - 是用 Swift 写的类似 Apple TV Parallax 效果的视图。
    • SDECollectionViewAlbumTransition - 用自定义的 push 和 pop 实现了有趣的 iOS 相册翻开动画效果。
    • SKPhotoBrowser.swift - swift中规中矩、实用的图片浏览类库。示例也很完整。
    • Nuke.swift - 完整、强大、实用的图片管理类库。主要功能包括可定制装载,缓存,滤镜及尺寸变换。
    • PagingView.swift - 注重细节的自动布局分页视图组件。
    • DouBanMeinv.swift - 抓取豆瓣美女图片,瀑布流显示。
    • SwViewCapture.swift - SwViewCapture.swift一个用起来还不错的iOS截图库.(支持截取所有内容, 适用于所有ScrollView组成的视图, 包括WebView)。
    • Filterpedia.swift - 强大的图片滤镜库演示。
    • preview-transition.swift - 通过向导式代码实现步骤,实现完整、自然流畅的图片预览及转场功能。
    • CartoonEyes.swift - 前置摄像头捕获图像后,采用 Core Image 脸部识别 CIDetector 和漫画效果滤镜复合出卡通效果眼睛。

    图表

    摄像照相视频音频处理

    • CameraManager - 相机管理封装类库。看着极好用的样子—-swift。
    • recordDemo.swift - 一个Swift语言实现直接可以用的录音Demo,实现说明
    • Swift-Radio-Pro - 集成 LastFM 的专业电台应用(基于 Swift 2.0)。
    • mobileplayer-ios.swift - 很不错的高度可定制播放器项目。
    • Periscope-VideoViewController.swift - 简洁实用的视频快进、倒带控制视图类库。
    • AudioKit.swift - 音频合成、加工及分析平台(支持 iOS、OS X、tvOS)框架库。无论其易用性,还是功能性及专业性。
    • SkfSwiftCammer - 一个相机demo,在oc里面调用了swift。
    • BMPlayer.swift - 基于 AVPlayer 使用 Swift 封装的视频播放器,方便快速集成,支持横屏、竖屏,上下滑动调节音量、屏幕亮度,左右滑动调节播放进度。

    响应式框架

    • RxSwift - RxSwift:函数响应式编程框架。
    • RxPermission.swift - 通过绑定 RxSwift 实现的 RxPermission。
    • Permission.swift - 统一的 API 请求 iOS 本地设备及资源权限类库。
    • ReactiveAnimation - ReactiveCocoa 推出了一个叫 ReactiveAnimation 的子项目,直接用完全用 Swift 来实现了。
    • Swiftest - BDD 全称 Behavior Driven Development,行为驱动开发。各种 DD 数不胜数,孰优孰劣争论不休,其实归根结底还是要根据使用场景进行选择。

    消息相关@

    消息推送客户端@
    消息推送服务端@
    通知相关@
    • Homeoff - 用swift写了一个模仿Launcher通知中心快捷方式的应用。支持20个应用,并增加了一个返回到桌面来解放Home键的功能。
    • SwiftNotificationCenter - 一个面向协议的类型安全、线程安全、内存安全的通知中心。

    时间日期@

    版本新API的Demo@

    代码安全与密码@

    • OAuthSwift - OAuthSwift国外主流网站OAuth授权类库。
    • CryptoSwift - swift加密库, 支持md5,sha1,sha224,sha256…。

    测试及调试@

    • depcheck Swift 工程分析工具(Dependency analyzer tool for Swift projects)
    • CleanroomLogger - 相当于 CocoaLumberjack 或 Log4j 的 Swift 版本,功能上甚至更强大。另外,源代码中已经内含了完整的 API 文档,使用非常方便。
    • Quick - 用于Swift中的单元测试(也可用于Objective-C),与Xcode整合在一起。如果你是Objective-C的粉丝,我建议用Specta代替这个,但是对Swift使用者来说,Quick是最佳选择。
    • Sleipnir - Swift的测试框架。
    • XXPlaceHolder.swift - MMPlaceHolder的swift版本。
    • SwiftyBeaver - 一个完善的日志工具,支持彩色输出、输出内容到文件、重要性分级、多输出目标。工具执行在后台,不影响性能,可以极大提高开发效率。
    • swiftlog - 为Swift 应用提供快捷添加日志信息的方法,Swift 包管理支持(SPM)、 使用惊艳的 Rainbow 包输出彩色日志、支持写入文件。使用 swiftlog
    • Log.swift - 灵活、易用、可定制输出格式和主题风格的日志类(Swift),支持控制台彩色输出。
    • Cuckoo.swift - Cuckoo.swift一款用法更接近于传统单元测试 Mock 框架库(区别之处在于需要用脚本预先生成 Mock 类)。
    • XCGLogger.swift - XCGLogger.swift功能完整的日志管理类库。
    • Peek.swift - 更友好、手势方式检查界面内组件布局信息(相当于浏览器元素检查功能),界面调试利器。

    动态更新@

    AppleWatch@

    • Apple Watch开发教程资料汇总 - Apple Watch开发教程资料汇总。
    • Stargate - 通过 iPhone 桥接实现 Mac 与 Watch 的即时通讯。Stargate 通过封装两个优秀的基础类库 MMWormhole 和 PeerKit 实现高效的通讯应用。–swift
    • soon - 一款倒计时 WatchKit 示例应用。作者从架构的角度,思考如何设计一款完整、通讯高效且性能又好的 WatchKit 扩展应用。该示例学习性非常强。–swift
    • MMWormhole.swift - MMWormhole.swift:iOS或OS X扩展与宿主应用的通讯框架。

    VPN@

    • vpnon - swift的VPN On 的源码和本地化内容都是开放的: 官方网站

    完整App@

    • V2ex-Swift - 用 Swift 写的 V2EX 客户端。
    • iBBS-Swift - “新手开源一个用Swift(2.0)写的论坛客户端”。BBS 服务端
    • NirZhihuDaily2.0_swift - 精仿了知乎日报iOS端练手,Swift2.0,注释相当详细。
    • DesignerNewsApp - Swift 开发的 DesignerNews 客户端,看着美美的!
    • Eidolon - 艺术品拍卖的投标亭平台,用swift与反应式编程框架 ReactiveCocoa。
    • BaiduFM-Swift - 百度FM, swift语言实现,基于最新xcode6.3+swift1.2,初步只是为了实现功能,代码比较粗燥,后面有时间会整理,支持Apple Watch。
    • Tuan - 模仿MJ老师iPad版美团(swift版),偶有bug 见谅。
    • CocoaChinaPlus - CocoaChina+是一款开源的第三方CocoaChina移动端。整个App都用Swift2.0编写(除部分第三方OC代码外,比如JPush和友盟)。
    • SimpleMemo - 易便签已经转到Swift2.0,全面适配iOS9和Watch OS2,并支持iPhone6s和iPhone6sPlus的3D Touch功能,包括图标快捷键和内容预览。
    • furni-ios.swift - furni-ios.swift是由 Twitter 开发团队出品的一款用 Swift 写的 iOS 家居商城应用, 其主要目的在于让开发者从这款 Demo 应用中看出 Fabric 的强大。
    • SelectionOfZhihu.swift - 『看知乎』iOS 客户端, 项目说明

    • Yep.swift - Yep 一个由天才开发给天才们使用的社交软件。

    • LoveFreshBeen.swift - 高仿爱鲜蜂 - Swift2.0
    • trySwiftApp.swift - trySwiftApp一款较为完整的会议原型应用。有需求的同学可以做为开发参考。
    • PinGo.swift - PinGo.swift:纯Swift编写的仿“随遇”App。
    • UmbrellaWeather.swift - UmbrellaWeather.swift使用 Swift 编写的一款天气应用,现已上架 AppStore。
    • SwiftWeather - SwiftWeather清新淡雅持续改进天气预报项目。
    • Phonetic.swift - Phonetic一个 iOS 版的 Phonetic Contacts,功能很多,其中昵称功能非常实用,已在 GitHub 开源并上架 App Store。
    • edhita.swift - edhita.swift支持Markdown, HTML预览的文本编辑器。
    • PilesSugar.swift - PilesSugar.swift:Swift高仿项目,堆糖。
    • react-native-gitfeed - 目前最实用简洁的github客户端了。
    • SoundCloudSwift - SoundCloud的Swift版本,采用Swift2.0,Reactive API with ReactiveCocoa 4.0。
    • LeagueofLegends - 一个关于英雄联盟的完整iOS开源项目,接口均来自多玩,腾讯各大游戏平台。
    • Coderpursue.swift - 一款 Github 第三方客户端,使用最新 Swift 语言编写。
    • BTApp - BTApp 仿半糖 iOS App 的 Demo 应用。

    好的文章@

    Xcode插件@

    • Swimat - Swimat,是一款Xcode 插件,帮你一键格式化 swift 代码。
    • XcodeSwiftSnippets - XcodeSwiftSnippets, 提供了很多可在 Xcode 上使用的 Swift 代码片段, 通过自动补全的方式极大的提高了开发效率。

    美工资源@

    其他资源@

    开发资源@

    二维码@

    • LBXScan 赞 A barcode and qr code scanner (二维码、扫码、扫一扫、ZXing和ios系统自带扫码封装,扫码界面效果封装)(Objective-C和Swift均支持).
    开发资料@

    学习资料@

    他人开源总结@

    学习笔记@

    好用的软件@

    设计@

    物联网@

    视频播放器@
    展开全文
  • swift中?和!

    2018-05-09 10:24:35
    swift已经更新到4.0了,苹果也逐步重视起来,这就逼着你去了解这个语言。看着通篇的? 、!以及??,说实话有点晕。。。 ?其实就是swift的一种新的类型,这个类型是一个可选类型(optional)。这个标志表示我定义...

    swift已经更新到4.0了,苹果也逐步重视起来,这就逼着你去了解这个语言。看着通篇的? 、!以及??,说实话有点晕。。。 

    ?其实就是swift的一种新的类型,这个类型是一个可选类型(optional)。这个标志表示我定义一个变量为可选类型的。例如 

     let num:Int?

    这个可选类型就是表示,我生明了一个类型如果有值就为Int类型的,如果没有值那么就是nil。所以说我并没有声明变量num为Int类型,而是可选类型的,可能是Int也可能是nil。

    当我对num显式赋值时

    let num:Int? = 3

    那么num就是Int类型,当我没有对num显式赋值,那么num为nil类型

    如果想要操作一个optional类型的变量,需要先进行解包,然后才能操作,这时就用到了!

    !表示强解包,在使用的时候要注意,如果有值就会得到变量的值,如果为nil那么程序会crash

    例如

    // 定义一个string的可选类型str,显式赋值
    var str: String? = "Hello"
    if str{
        let message = "你好" + str!
        print(message)
    }

    因为已经给str赋值为hello,所以if判断条件成立,然后给name强解包,得到hello

    同样

    // 定义一个string的可选类型str,但是没有显式赋值
    var str: String?
    let message = "你好" + str!
    print(message)

    强解包程序会crash掉

    所以在使用!强解包的时候一定要确定解包对象不为nil,否则会引起程序崩溃

    展开全文
  • 关于 Swift

    2019-05-11 19:01:26
    Swift 语言成功整合了现代语言最好的思想于一身。Swift 编译器对性能进行了优化,Swift 语言则对开发进行了优化,两者互不干扰。 Swift 采用了现代编程模式,以避免大量常见的编程错误: 变量永远会在被使用前完成...

    Swift 语言成功整合了现代语言最好的思想于一身。Swift 编译器对性能进行了优化,Swift 语言则对开发进行了优化,两者互不干扰。

    Swift 采用了现代编程模式,以避免大量常见的编程错误

    • 变量永远会在被使用前完成初始化。
    • 对数组的索引操作会自动检查是否出现越界错误。
    • 整型值会自动检查是否溢出。
    • 可选值确保 nil 值被正确处理。(可选类型)
    • 内存被自动管理。
    • 错误处理允许从异常故障控制恢复。(什么鬼❓?)

    总结: Swift是一门易于编写, 易于阅读 & 易于维护的计算机语言.

    展开全文
  • Swift编程语言(Swift 5)

    2020-07-29 14:19:59
    介绍: 《Swift 编程语言》是苹果官方对 Swift 语言做的权威指南,很遗憾苹果公司并没有进行多语言支持。所以我独立发起了这个手册的翻译工作——与其他现存翻译不同的是:它同步更新苹果官方的 Swift 开发者预览版 ...
  • Swift 5.3 路线图

    2020-03-29 00:01:46
    作者 | Nicole Jacque来源 | Swift Blog来源公众号丨知识小集(zsxjtip)这篇文章出自 Swift 官方博客,描述了 S...

    作者 | Nicole Jacque 
    来源 | Swift Blog

    来源公众号丨知识小集(zsxjtip)

    这篇文章出自 Swift 官方博客,描述了 Swift 5.3 的目标,发布进程和预计时间表。

    动机和目标

    Swift 5.3 的目标依旧是继续提升质量的增强性能。此外,这个版本还将扩展支持 Swift 的平台的数量,特别是增加对 Windows 和其他 Linux 发行版的支持。

    Swift 5.3的快照

    Swift 5.3 的 release 分支的可下载快照将作为持续集成测试的一部分定期发布。同时尽可能为新支持的平台添加快照下载。

    Swift 5.3 发布后,除了快照外,还将提供正式版本的下载。

    将变更纳入 Swift 5.3

    2020 年 4 月 20 日,我们将从 Swift 代码库和大多数相关的项目库中签出  release/5.3 分支。请留意新的分支命名方案。这个分支包含那些将在 Swift 5.3 中发布的变更。在签出分支后,如果变更符合发布标准,则可以通过 pull request 将变更放到这个分支上。

    一些项目将在不同日期签出其 Swift 5.3 分支:

    这些项目也将采取相同的策略:签出分支后,如果变更符合发布标准,则可以通过 pull request 将变更放到新分支上。

    将变更引入 Swift 5.3 的策略

    • Swift 5.3 的所有语言和 API 的变更都将通过 Swift Evolution 流程进行。Evolution 提案应该在分支建立日期之前完成,以增加其加入 Swift 5.3 版本的机会。将根据具体情况考虑一些例外情况,尤其是如果它们与发行版的核心目标相关时。

    • 将根据风险和影响接受其他变更(例如错误修复,诊断改进,SourceKit 接口改进)。

    • 如果低风险测试调整有助于提升发布的资量,则也可以在发布分支后期被接受。

    • 随着版本的收敛,可接受的变更的标准将变得越来越严格。

    受影响的代码库

    以下代码库将有 release/5.3 分支,以作为Swift 5.3发行版的一部分:

    • indexstore-db

    • sourcekit-lsp

    • swift

    • swift-cmark

    • swift-corelibs-foundation

    • swift-corelibs-libdispatch

    • swift-corelibs-xctest

    • swift-integration-tests

    • swift-llbuild

    • swift-package-manager

    • swift-stress-tester

    • swift-syntax

    • swift-tools-support-core

    • swift-xcode-playground-support

    llvm-project 也将有一个相应的 swift/release/5.3 分支。

    为 release 分支提 Pull request

    在新建 release 分支(release/5.3)后,如果希望一个 pull request 被列入这个 release 分支,则必须包含以下信息:

    • 说明:对已解决的问题或增强的功能的描述。可以很简短,但应该描述清楚。

    • 范围:对变更的影响/重要性的评估。例如,变更是否是对现有代码有破坏性,等等。

    • SR(Swift Report)问题:指明是否变更解决/实现了 bug.swift.org 的问题/增强

    • 风险:此变更对发布产生的(特定)风险是什么?

    • 测试:已经进行或需要进行哪些具体测试以进一步验证此变更的影响?

    • 审阅者:受影响组件的一个或多个代码所有者需要审阅相应的变更。可以由代码所有者委托进行技术审查,或者以其他适当或有用的方式请求进行技术审查。

    在 release/5.3 分支上进行的所有变更都必须经过相应的发布管理人员处理。

    近期精彩内容推荐:  

     直播界要哭了!罗永浩进军电商直播

     家裁员我加薪,他凭什么身价1200亿?

     什么?你还在使用fastjson,性能太差了

     2020年抖音用户画像报告

    在看点这里好文分享给更多人↓↓

    展开全文
  • 1 “…” 和 “..” //0...5是一个闭区间[0,5] for index in 0...5 { print(index)//print &quot;012345&quot; } println(&quot;\n&quot;) //0..&amp;lt;5是一个前闭后开区间[0,5) ...0
  • C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++于2014年8月18日公布。[1] 其编程领域众广,常用于系统开发,引擎开发...
  • Swift 5 基础语法篇

    2019-09-02 16:16:43
    常量 只赋值一次,它的值不要求在编译时期确定值,但在使用之前赋值一次 let a = 10 let b: Int = 20 let c: Int c = a + b 标识符 标识符(常量变量函数名)不能用数字开头,不能包含空白字符、制表符、箭头等特殊...
  • 本系列只是一个Swift快速入门的教程,并没有详尽的介绍SwiftSwift也并不是一个简单的编程语言,所以要想详尽的系统的学习Swift,本系列并不适合你,此系列只是让开发者可以快速的用Swift来进行开发。另外学习本...
  • Swift初见】Swift数组

    2015-02-27 20:25:04
    在Objective-C中数组是常用的数据类型,在Swift中同样如此,在OC中有NSArray与NSMutableArray之分,但是在Swift中只有通过let和var来区分数组是否可变,Swift中的数组是类型安全的,所以在某个数据被存入到某个数组...
  • Optional也是Objective-C没有的数据类型,是苹果引入到Swift语言中的全新类型,它的特点就和它的名字一样:可以有值,也可以没有值,当它没有值时,就是nil。此外,Swift的nil也和Objective-C有些不一样,在...
  • Swift于2015年底开源时,随之而来的最令人惊讶和最有趣的新项目之一是Swift Package Manager。虽然它不是Swift项目的第一个依赖管理器,但它是第一个由Apple正式提供和支持的,许多开发人员认为这是一个非常好的...
  • 第二种方式,通过隐藏的符号 @asmname把C语言的函数映射成swift的函数 具体以下解释 *第一种 桥接方式* -------而对于第三方的 C 代码,Swift 也提供了协同使用的方法。我们知道,Swift 中调用 Objective-C 代码...
  • 本人最近开始学习有关Swift这个新东东,由于没有项目支撑,只能通过官方文档进行自学,精简的看了Swift官方文档,感觉理解起来还是比较简单,于是突发奇想,想把官方object-c的sample进行改造,使用Swift完成重点...
1 2 3 4 5 ... 20
收藏数 141,348
精华内容 56,539
关键字:

swift