从此刻开始拥抱 Swift 3.0

来源:互联网 发布:啊哈算法属于什么 编辑:程序博客网 时间:2024/06/04 08:29

API is shortened
++ / –
Swift 2.2 的时候对 a ++ 或者 a – 已经给出warning 提示将在Swift3.0中将废除。

不嫌麻烦可以重载运算符来实现

postfix operator ++postfix func ++(a: Int) -> Int {    return a + 1}a++ // 11

更彻底点可以考虑使用引用,加上 inout

函数中的 var
为了修改函数参数,添加 var 关键字

func setName(var name: String) {}

现已删除

func setName(name: String, na: String) {    name += na}

无法再修改参数, inout可以

Repeat

var i = 0repeat {    print("Hello")    i = i + 1} while( i < 10 )

替代 do while 感觉主要是避免与 do catch冲突

每个函数的参数标签一致:

func getPerson(name: String, age: Int) {    //....}

Swift 2.2 中:

getPerson("Vic", age: 10)

Swift 3 中:

getPerson(name: "Vic", age: 10)

除非手动添加 _ 否则参数名会保持一致性原则

一直在改变的Selector
Swift 3:

button.addTarget(Responder(), action: #selector(Responder.tap), for: .touchUpInside)

将确定selector的过程从运行时移到了编译时。

KVO

#KeyPath()//形式类似于Selector

只适用于非Objc对象。

class Object : NSObject {    @objc var name = ""    var age = 0    init(name: String, age: Int) {        self.name = name        self.age = age    }}let sss = p.value(forKey: #keyPath(Object.age))

@discardableResult
如果未使用函数返回值,在没有 @discardableResult的前提下,会报错

fileprivate: 让私有变得更具体
之前 Swift 2.2 及之前版本,private 并不是严格的私有,在同一文件,依然可以访问到.

为了严格化, Swift3.0 中 设置了 fileprivate 来取代之前 private 的作用。 而新的 private 则是严格的私有权限。

fileprivate func sss() {}private func aaa() {}

private 变得更加严格。

class Access {    private var a = 0    private func getA() -> Int {        return a;    }    fileprivate func desc() {        print("\(a) time")    }}let p = Access()// 报错,提示getA() 是私有成员p.getA()

上述p只能访问desc()

Swift现有 访问级别
公开(public)
内部(internal)
文件外私有(fileprivate)
私有(private)

inout 变了

之前的写法

func saaa(inout a: Int) {}

现在作为一种修饰符而存在

func saaa(a: inout Int) {}

**关联类型声明由 typealias 变为 associatedtype
先说下 Swift的关联类型**

Swift支持泛型,class struct enum 都支持泛型, 而协议呢?

Swift是一门面向协议的语言。

protocol hahah<T> {}

Protocols do not allow generic parameters, use associated types instead

泛型协议

protocol Haha {    associatedtype Element    var s: Int { get set }    func getElement() -> Element}

在 Swift 3 中, 不再允许 typealias 来构造泛型。

告别C经典循环方式

for (int i = 0; i < 10; i ++)

Swift Loop Style

// i is not mutablefor i in 1...3 {   // i += 1       print(i)}// i is mutablefor var i in 1...10 {       i += 1    print(i)}// 枚举(1...3).forEach{i in    print(i)}

告别柯里化函数

Xcode 7.3 的 Swift 2.2 版本中已有提示柯里化函数不再使用。

func add(a: Int)(b: Int) -> Int {    return a + b}

当然函数式编程依然完美解决

func add(_ a: Int) -> (Int)-> Int {    return { b in return a + b }}var s = add(10)(20)
1 0
原创粉丝点击