swiftui 中文教程_ci

4. 除了M_PI 还有 .pi

在过去,我们使用 M_PI 常量来表示 π。所以根据半径求周长代码如下:

let r =  3.0
let circumference = 2 * M_PI * r
在 Swift3 中,π 提供了 Float,Double 与 CGFloat 三种形式(Float.pi、Double.pi、CGFloat.pi),所以求周长还可以这么写:
let r = 3.0
let circumference = 2 * Double.pi * r
 
//我们还可以将前缀省略,让其通过类型自动推断
let r = 3.0
let circumference = 2 * .pi * r


5.简化GCD的写法
关于 GCD,过去写法采用 C 语言的风格,初学者可能会不大适应。比如创建一个简单的异步线程:

let queue = dispatch_queue_create("Swift 2.2", nil)
dispatch_async(queue) {
    print("Swift 2.2 queue")
}

Swift 3 取消了这种冗余的写法,而采用了更为面向对象的方式:

let queue = DispatchQueue(label: "Swift 3")
queue.async {
    print("Swift 3 queue")
}

6. Core Graphics的写法也更加面向对象化

Core

Graphics 是一个相当强大的绘图框架,但是和 GCD 一样,它原来的 API 也是 C 语言风格的。
比如我们要创建一个 view,其内部背景使用 Core Graphics 进行绘制(红色边框,蓝色背景)。过去我们这么写:

class View: UIView {
    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        let blue = UIColor.blueColor().CGColor
        CGContextSetFillColorWithColor(context, blue)
        let red = UIColor.redColor().CGColor
        CGContextSetStrokeColorWithColor(context, red)
        CGContextSetLineWidth(context, 10)
        CGContextAddRect(context, frame)
        CGContextDrawPath(context, .FillStroke)
    }
}
 
let frame = CGRect(x: 0, y: 0, width: 100, height: 50)
let aView = View(frame: frame)
在 Swift 3 中改进了写法,只要对当前画布上下文解包,之后的所有绘制操作就都基于解包对象。
class View: UIView {
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
         
        let blue = UIColor.blue.cgColor
        context.setFillColor(blue)
        let red = UIColor.red.cgColor
        context.setStrokeColor(red)
        context.setLineWidth(10)
        context.addRect(frame)
        context.drawPath(using: .fillStroke)
    }
}
 
let frame = CGRect(x: 0, y: 0, width: 100, height: 50)
let aView = View(frame: frame)

7.新增的访问控制关键字:fileprivate、open
在 Swift 3 中在原有的 3 个访问控制关键字 privatepublicinternal 外。又添加了2个新关键字 fileprivateopen。它们可以看成是对原来 private 和 public 的进一步细分。