斯威夫特3新性情汇总

事情发生在此以前 Apple 在 WWDC 辰月将 斯威夫特 3 整合进了 Xcode 8 beta
中,而前一个月苹果发表了 Swift 3 的正式版。那也是自 贰零壹陆年初Apple开源Swift之后,第八个公布的首要版本(Swift 3.0),该版本实现了
斯威夫特 演变进度中所商量并经过的90多少个提出。这里作者对 斯维夫特 3
的新性子、新变化举行叁个总括。


意气风发、深透移除在 斯威夫特 2.2 就早就弃用的特色

这个特征在大家使用 Xcode 7.3 的时候就曾经有报告急察方提示,在 Swift 3
中已将其根本移出。

1、弃用 ++ 与 — 操作符

过去我们得以应用 ++ 与 — 操作符来落到实处自增自减,现已甩掉。

var i = 0
i++
++i
i--
--i

能够动用复合加法运算(+=)与减法运算(-=),可能接受普通的加法运算(+)与减法运算(-)完成均等的效果。

2、撤废C语言风格的for循环

我们过去只怕习于旧贯上面风格的 for 循环,今后也已放任。

现行能够利用 for-in 循环,也许使用 for-each 加闭包的写法完结均等的作用。

//for-in循环
for i in 1...10 {
    print(i)
}
//for-each循环
(1...10).forEach {
    print($0)
}

3、移除函数参数的 var 标志

在 斯威夫特 函数中,参数默许是常量。过去能够在参数前加关键字 var
将其定义为变量,那样函数内部就能够对该参数举行改过(外界的参数任然不会被改良)。

var age = 22
add(age)
func add(var age:Int) {
    age += 1
}

目前这种做法早已被抛弃,斯维夫特 3 不再允许开垦者那样来将参数标志为变量了。

4、全部函数参数都必需带上标签

过去生龙活虎旦二个函数有多个参数,调用的时候第二个参数不要求带标签,而从第2个参数开始,必须要带标签。

let number = additive(8, b: 12)
func additive(a:Int, b:Int) -> Int{
    return a + b
}

今后为了保障函数参数标签的意气风发致性,全体参数都必需带上标签。

let number = additive(a: 8, b: 12)
func additive(a:Int, b:Int) -> Int{
    return a + b
}

其少年老成转换也许会以致我们的花色代码要开展非常的大的改观,毕竟涉及的地点重重。所以苹果又交给了大器晚成种不用给第一个参数带标签的解决方案。即在率先个参数后边加上叁个下划线。
(然而那个只是方便我们代码从 Swift2 迁移到 Swift3
的叁个折中方案,能够的话仍然提议将富有的参数都带上标签。)

let number = additive(8, b: 12)
func additive(_ a:Int, b:Int) -> Int{
    return a + b
}

5、函数注明和函数调用都亟需括号来总结参数

大家能够应用函数类型作为参数
,对于五个参数是函数、重返值也是函数的函数。原来作者们或者会这么写:

func g(a: Int -> Int) -> Int->Int { ... }

当如此特别难以阅读,比好丑出参数在哪儿停止,重回值又从哪儿开首。在 Swift3 中产生那样定义那些函数:

func g(a:(Int) -> Int) -> (Int) -> Int { ... }

6、Selector 不再允许利用 String

假定大家给开关加多叁个点击事件响应,点击后进行 tapped
函数。在此之前能够这么写:

button.addTarget(responder, action: "tapped", forControlEvents: .TouchUpInside)

但出于开关的 selector
写的是字符串。假若字符串拼写错了,那程序会在运营时因找不到相关办法而咽气。所以
Swift 3 将这种写法废除,改成
#selecor(卡塔尔(英语:State of Qatar)。那样就将允许编写翻译器提前检查措施名的拼写难题,而不用再等到运转时才意识题目。

button.addTarget(self, action:#selector(tapped), for:.touchUpInside)

二、斯维夫特 3 的新特性

1、内联连串函数sequence

斯威夫特 3 新添了多个全局函数:sequence(first: next:卡塔尔(قطر‎ 和 sequence(state:
next:卡塔尔。使用它们能够回到叁个Infiniti连串。下边是三个简约的施用样例,更详细的介绍能够本身的另生龙活虎篇作品:Swift

  • 内联类别函数sequence介绍(附样例)

    // 从某多个树节点一直提高遍历到根节点
    for node in sequence(first: leaf, next: { $0.parent }卡塔尔(英语:State of Qatar) {
        // node is leaf, then leaf.parent, then leaf.parent.parent, etc.
    }// 遍历出全体的2的n次方数(不构思溢出)
    for value in sequence(first: 1, next: { $0 * 2 }) {
        // value is 1, then 2, then 4, then 8, etc.
    }

2、 key-path不再只好动用String

这些是用在键值编码(KVC)与键值观察(KVO)上的,具体 KVC、KVO
相关内容能够参照作者原本写的那篇随笔:Swift –
反射(Reflection)的牵线与应用样例(附KVC介绍)
咱俩仍旧得以持续接受 String 类型的 key-Path:

//用户类
class User: NSObject{
    var name:String = ""  //姓名
    var age:Int = 0  //年龄
}
//创建一个User实例对象
let user1 = User()
user1.name = "hangge"
user1.age = 100
//使用KVC取值
let name = user1.value(forKey: "name")
print(name)
//使用KVC赋值
user1.setValue("hangge.com", forKey: "name")

但提议选取大幅度增涨的 #keyPath(卡塔尔(قطر‎写法,那样能够制止大家因为拼写错误而吸引难点。

//使用KVC取值
let name = user1.value(forKeyPath: #keyPath(User.name))
print(name)
//使用KVC赋值
user1.setValue("hangge.com", forKeyPath: #keyPath(User.name))

3、Foundation 去掉 NS 前缀

比方过去大家应用 Foundation 相关类来对文本中的 JSON
数据进行深入分析,这么写:

let file = NSBundle.mainBundle().pathForResource("tutorials", ofType: "json")
let url = NSURL(fileURLWithPath: file!)
let data = NSData(contentsOfURL: url)
let json = try! NSJSONSerialization.JSONObjectWithData(data!, options: [])
print(json)

在 Swift 3 中,将移除 NS 前缀,就改成了:

let file = Bundle.main.path(forResource: "tutorials", ofType: "json")
let url = URL(fileURLWithPath: file!)
let data = try! Data(contentsOf: url)
let json = try! JSONSerialization.jsonObject(with: data) 
print(json)

4、除了M_PI 还有 .pi

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

let r = 3.0
let circumference = 2 * M_PI * r

在 斯维夫特 3 中,π 提供了 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,作者原本写过大器晚成篇有关作品:Swift – 三十九线程达成方式(3) – Grand
Central Dispatch(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 个访问调整关键字 private、public、internal
外。又增添了2个新入眼字 fileprivate、open。它们能够用作是对原来 private
和 public 的愈加细分。具体应用方法和介绍能够看自个儿写的另意气风发篇文章:斯维夫特

  • Swift3新添的五个访谈调节关键字介绍(fileprivate、open)

三、一些语法的改换

1、数组排序:sort(卡塔尔国与sorted(卡塔尔

过去数组排序的八个办法:sortInPlace(卡塔尔(英语:State of Qatar) 和 sort(卡塔尔国,今后各自更名成 sort(卡塔尔(قطر‎和 sorted(卡塔尔(英语:State of Qatar)
sort(卡塔尔(قطر‎ 是直接对目的数组进行排序。sorted(卡塔尔(قطر‎是回到贰个排序后的数组,原数组不变。

var array1 = [1, 5, 3, 2, 4]
array1.sort()
print(array1)  //[1, 2, 3, 4, 5]
var array2 = [1, 5, 3, 2, 4]
let sortedArray = array2.sorted()
print(array2)  //[1, 5, 3, 2, 4]
print(sortedArray)  //[1, 2, 3, 4, 5]

2、reversed()与enumerated()

过去 reverse(卡塔尔 方法完成数组反转,enumerate(卡塔尔国方法完结遍历。现那多个章程都增加 ed 后缀(reversed、enumerated)

for i in (1...10).reversed() {
    print(i)
}
let array = [1, 5, 3, 2, 4]
for (index, value) in array.enumerated() {
    print("(index + 1) (value)")
}

3、CGRect、CGPoint、CGSize

过去的 CGRectMake、CGPointMake、CGSizeMake 已废弃。现改用
CGRect、CGPoint、CGSize 代替。

//Swift 2
let frame = CGRectMake(0, 0, 20, 20)
let point = CGPointMake(0, 0)
let size = CGSizeMake(20, 20)
//Swift 3
let frame = CGRect(x: 0, y: 0, width: 20, height: 20)
let point = CGPoint(x: 0, y: 0)
let size = CGSize(width: 20, height: 20)

4、移除了API中多余的单词

  • XCPlaygroundPage.currentPage 改为 PlaygroundPage.current
  • button.setTitle(forState) 改为 button.setTitle(for)
  • button.addTarget(action, forControlEvents) 改为
    button.addTarget(action, for)
  • arr.minElement() 改为 arr.min()
  • arr.maxElement() 改为 arr.max()
  • attributedString.appendAttributedString(anotherString) 改为
    attributedString.append(anotherString)
  • names.insert(“Jane”, atIndex: 0) 改为 names.insert(“Jane”, at: 0)
  • NSBundle.mainBundle() 改为 Bundle.main
  • UIDevice.currentDevice() 改为 UIDevice.current
  • NSData(contentsOfURL) 改为 Data(contentsOf)
  • NSJSONSerialization.JSONObjectWithData() 改为
    JSONSerialization.jsonObject(with)
  • UIColor.blueColor() 改为 UIColor.blue

5、枚举成员成为小写字母开头

Swift 3
将枚举成员充作属性来看,所以现在利用小写字母开端并非先前的大写字母。

.system //过去是:.System
.touchUpInside //过去是:.TouchUpInside
.fillStroke //过去是:.FillStroke
.cgColor //过去是:.CGColor

6、@discardableResult

在 Swift 3
中,即使三个主意有再次回到值。而调用的时候从不收取该办法的重回值,Xcode
会报出警示,告诉你那只怕会存在潜在难题。

图片 1

除此而外能够因而接受重回值清除警报。还足以通过给艺术申明 @discardableResult
来抵达湮灭目标。

.system //过去是:.System
.touchUpInside //过去是:.TouchUpInside
.fillStroke //过去是:.FillStroke
.cgColor //过去是:.CGColor

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        printMessage(message: "Hello Swift 3!")
    }
    @discardableResult
    func printMessage(message: String) -> String {
        let outputMessage = "Output : (message)"
        return outputMessage
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

原稿出自:航歌网

发表评论

电子邮件地址不会被公开。 必填项已用*标注