Date
Jul. 14th, 2024
 
2024年 6月 9日

Post: Swift 3.0 怎么玩

Swift 3.0 怎么玩

Published 12:09 Sep 09, 2016.

Created by @ezra. Categorized in #Programming, and tagged as #iOS.

Source format: Markdown

Table of Content

Swift 已经发展到 3.0,早在几个月前苹果就已经表明 Swift 3.0 还将会有不少崩坏性的改动,这篇博客就来介绍一下新版本 Swift 的主要改动。

编译器与语法

参数标签

在 Swift 3.0 中的函数、方法,从第一个参数开始就必须指定参数标签,当然,你可以使用 _ 明确指出调用时省略参数。

func sum(left: Int, right: Int) -> Int {
    return left + right
}

sum(left: 1, right: 2)
// 在以往的版本中你可能是这样调用的:
// sum(1,2)
// sum(1, right: 2)

取消 var 参数

有些朋友使用过这样的语法:

func increase(var a:Int){
    a += 1
}

这样的语法已经被抛弃:

func increase(a:Int){
    var a = a
    a += 1
}

(也可能在 2.x 中已经抛弃,记不清了姑且放在这吧)

inout 修饰符的位置

在之前的历史版本中我们这样使用 inout 关键字:

func increase(inout a: Int) {
    a += 1
}
func increase(a: inout Int) {
    a += 1
}

返回值

带有返回值的方法被调用时,返回值不接收将产生警告。

但有些情况下并不需要其返回值,这种情况下有两种方式应对:

  • 使用 _ 接收

  • 增加 @discardableResult 声明

struct Caculator {
    func sum(a: Int,b: Int) -> Int {
        return a + b
    }

    @discardableResult
    func sum2(a: Int,b: Int) ->Int {
        return a - b + 1
    }
}

let ca = Caculator()

ca.sum(a: 1, b: 2) // 警告

let _ = ca.sum(a: 1, b: 2)

ca.sum2(a: 1, b: 2)

可选类型

对于可选类型控制变得更加严谨:

let a: Int! = 1
let b = a + 1 // 此时强制解包,b 为 Int
let c = a // 注意: c 为 Int? 而不再是 Int!

Selector

Selector 可以说经历了多次改变:

class SomeClass {
    @objc func sum(a: Int, b: Int) -> Int {
        return a + b
    }

    func test(){
        let _ = #selector(sum(a:b:))
        // 2.2:
        // let _ = #selector(sum(_:b:))
    }
}

协议

在 3.0 版本中,在协议中声明可选方法时,除了协议需要 @objc 修饰,可选方法本身也需使用 @objc 来修饰。

@objc protocol TheProtocol {
    @objc optional func optionalFunction()
    // optional func optionalFunction()
    func someFunction()
}

取消 ++-- 操作符

var a = 100
a++ // 报错
d += 1 // 正确
d = d + 1 // 正确

取消 C 式 for 循环

// for var i = 0 ;i < 100; i += 1 {
for i in 0..< 100  {
  // do something...
}

Cocoa Touch

方法名使用动词,其他词作为参数或移除

var array = [1,2,3]
array.append(contentsOf: [4,5,6]) // array.appendContentsOf([4,5,6])
array.remove(at: 0) // array.removeAtIndex(0)

忽略不必要的词与括号

let color = UIColor.red // UIColor.redColor()

NotificationCenter.default // NotificationCenter.defaultCenter()

枚举成员首字母变成小写

let label = UILabel()
label.textAlignment = NSTextAlignment.center // .Center

去 C 风格

进一步去除 C 风格语法:

if let ctx = UIGraphicsGetCurrentContext() {
// let ctx = UIGraphicsGetCurrentContext()

let rectangle = CGRect(x:0, y:0, width:512, height:512)
// let rectangle = CGRectMake(0, 0, 512, 100)

ctx.setFillColor(UIColor.red.cgColor)
// CGContextSetFillColorWithColor(ctx, UIColor.redColor().CGColor)

ctx.setStrokeColor(UIColor.black.cgColor)
// CGContextSetStrokeColorWithColor(ctx, UIColor.blackColor().CGColor)

ctx.setLineWidth(10)
// CGContextSetLineWidth(ctx,10)

ctx.addRect(rectangle)
// CGContextAddRect(ctx,rectangle)

ctx.drawPath(using: .fillStroke)
// CGContextDrawPath(ctx, .FillStroke)

UIGraphicsEndImageContext()
}
// CGAffineTransformIdentity
CGAffineTransform.identity

// CGAffineTransformMakeScale(2,2)
CGAffineTransform(scaleX:2, y:2)

// CGAffineTransformMakeTranslation(128,128)
CGAffineTransform(translationX:128, y:128)

// CGAffineTransformMakeRotation(CGFloat(M_PI))
CGAffineTransform(rotationAngle: CGFloat(M_PI))
if let context = UIGraphicsGetCurrentContext() {
    CGContext.fillPath(context)
    // CGContextFillPath(context1!)
}
NotificationCenter.defaultCenter().addObserver(self, selector: #selector(userDefaultChange()), name: UserDefaults.didChangeNotification, object: nil)

GCD的改变

let queue = DispatchQueue(label: "myqueue")
// let queue = dispatch_queue_create("myqueue", nil)
queue.async {
// dispatch_async(queue) {
  // code...
}
DispatchQueue.main.sync {
    // code...
}

集合

let array2 = [2,3,4,9]
let id = array2[1]
let next = array2.index(after: 0)
let first = array2.first
let firstWhere = array2.first { (e) -> Bool in
    e >= 4
}

let r = Range(0..<3) // let r = NSRange(location: 0, length: 3)

for subview in sequence(first: self.view, next: { $0?.superview }) {
    debugPrint(subview)
}

浮点协议

类型 FloatDoubleCGFloat 现在提供 IEEE-754 标准的属性和方法。

let a = 2 * Float.pi
// let a = 2 * M_PI

let b = 2.0 * .pi

Swift 语法判断

#if swift(>=2.2)
  print("Active!")
#else
  // this! code! will! not! parse! or! produce! diagnostics!
#endif

更多变化请请访问 Apple on Github .

Pinned Message
HOTODOGO
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF