澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站Swift3新特性汇总,的一些区

2019-07-07 作者:www.8455.com   |   浏览(173)

此前 Apple 在 WWDC 春天将 Swift 3 整合进了 Xcode 8 beta 中,而上月苹果宣布了 斯维夫特 3 的正式版。那也是自 2014年初Apple开源Swift之后,第二个公布的显要版本(Swift 3.0),该版本达成了 斯维夫特 衍变进度中所探讨并经过的90四个提议。这里自个儿对 Swift 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
}

现行这种做法早已被舍弃,Swift 3 不再允许开辟者那样来将参数标识为变量了。
4、全部函数参数都不可能不带上标签
千古借使二个函数有八个参数,调用的时候第三个参数不须求带标签,而从第二个参数伊始,必供给带标签。

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
}

那个变化可能会招致大家的系列代码要实行非常大的改观,究竟涉及的地方重重。所以苹果又交给了一种不用给第贰个参数带标签的消除方案。即在首先个参数前面加上贰个下划线。(可是那个只是利于大家代码从 斯威夫特2 迁移到 斯威夫特3 的三个折中方案,能够的话依旧建议将具备的参数都带上标签。)

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()。那样就将同意编写翻译器提前检查办法名的拼写难点,而不用再等到运营时才发觉难点。

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

二、Swift 3 的新特色

1、内联体系函数sequence
****Swift 3 新扩大了多个全局函数:sequence(first: next:) 和 sequence(state: next:)。使用它们得以回到一个特别系列。

// 从某一个树节点一直向上遍历到根节点
for node in sequence(first: leaf, next: { $0.parent }) {  
  // 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 相关内容能够参见小编本来写的这篇小说:斯维夫特 - 反射(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")

但提出选用激增的 #澳门新萄京官方网站Swift3新特性汇总,的一些区别。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)

在 斯维夫特 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,笔者本来写过一篇相关小说:斯威夫特 - 二十四线程完成格局(3) - Grand Central Dispatch(GCD)过去写法选择 C 语言的品格,初学者或者会相当小适应。比如成立三个简约的异步线程:

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

斯维夫特 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)

在 斯威夫特 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 的更为划分。具体行使格局和介绍能够看本人写的另一篇小说:斯维夫特

  • 斯维夫特3新添的三个访问调整关键字介绍(fileprivate、open)
    三、一些语法的修改

1、数组排序:sort()与sorted()
千古数组排序的七个办法:sortInPlace() 和 sort(),今后独家更名成 sort() 和 sorted()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)
澳门新萄京官方网站Swift3新特性汇总,的一些区别。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、枚举成员成为小写字母初阶
斯维夫特 3 将枚举成员当做属性来看,所以未来利用小写字母开始实际不是在此之前的大写字母。

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

6、@discardableResult
在 斯威夫特 3 中,假使一个艺术有重临值。而调用的时候从不接过该情势的再次回到值,Xcode 会报出警告,告诉你那只怕会存在潜在难点。!

澳门新萄京官方网站 1

7B0CDB34-A690-435C-9933-060BBD7D5938.png

除了能够经过接收重临值化解警告。还足以经过给艺术注脚 @discardableResult 来到达化解目标。

.system //过去是:
.System.touchUpInside
 //过去是:
.TouchUpInside.fillStroke 
//过去是:
.FillStroke.cgColor 
//过去是:
.CGColorimport 
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()
    }
}

7、Swift赋值运算符,溢出运算符, 空合併运算符 ??

        /**
         赋值运算符
         =     =  %=  *=  /=
         本质上是对内存的写操作
         */

        let b = 10
        var a = 9
        var d:Int

        a = 6
        // c语言中可以这样子,但是 在swfit中 表达式 a = 6 是没有值的
        // 在[Swift](http://lib.csdn.net/base/swift)中禁止连续赋值
        //        d = a = 6

        print("a的值(a)")
        print("a = 6表达式的值==(a = 6)")

        // 加括号的连续赋值都不行的呀
//                 d = (a  = 6)






        /**
         像这种就会报错的
         因为[swift](http://lib.csdn.net/base/swift)的赋值操作并不返回任何值。
         这个特性防止程序员将 c == 6 的判断误写成 c = 6,减少了常规的编码错误
         Use of '=' in a boolean context, did you mean '=='?
         */
//        if c = 6 {
//            print("lalla")
//        }



        /**
         溢出运算符  &  &-  &*
         */
        var c = UInt8.min

        /**
         Arithmetic operation '0 - 1' (on type 'UInt8') results in an overflow
         */
//        c = c - 1
        c = c &- 1
        print("c==(c)")
        /**
         c==255
         */


        /**
         Swift中可以 对浮点数求余
         */

        /**
         '%' is unavailable: Use truncatingRemainder instead
         现在不可以直接这样写了
         let rem = 10 % 2.3
         */
        let rem = CGFloat(10).truncatingRemainder(dividingBy: 2.3);
        print("rem==(rem)")
        /**
         rem==0.800000000000001
         remainderA is '1.0'.
         remainderB is '2.1'.
         */


        var remainderA = CGFloat(3).truncatingRemainder(dividingBy: 2);
        print("remainderA is '(remainderA)'.") // 输出 remainderA is '1'

        var remainderB = CGFloat(5.2).truncatingRemainder(dividingBy: 3.1)
        print("remainderB is '(remainderB)'.") // 输出 remainderB is '2.1'





         /**
         空合并运算符  (a ?? b) 将对可选类型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b。
         两个条件:表达式a必须是可选类型,默认值b的类型必须要和a存储值的类型一致

         在 Swift中有一个非常有用的操作符,可以用来快速的对 nil 进行判断。
         ??
         这个操作符可以判断当左侧的值是 非 nil时 Optional值时返回其value,
         左侧为nil时返回其右侧的值。比如
         */
        var level: Int?
        var startLevel = 1

        var currentLevel = level ?? startLevel
        print("currentLevel==(currentLevel)")

        let name: String? = "老王"
        let name1: String? = nil

        // ?? 运算符的优先级低于   号,注意使用的时候加上括号啊
        print(name ?? ""   "你好")
        print(name1 ?? ""   "你好")



        addNumber(x: 3, y: nil)


    func addNumber(x: Int?, y: Int?) -> Void {

        // 1.强制解包有风险
//        print(x!   y!)


        // 2.使用 if 判断,但是如果直接使用if,参数很多的时候,会使代码很丑
        if x != nil && y != nil {
            print(x!   y!)
        } else {
            print("x 或者 y 为nil")
        }

        // 使用 运算符 ??
        print((x ?? 0)   (y ?? 0))
    }

在Swift 2.0 中调用函数和措施已经做出了转移,在3.0中又发生了扭转,而这一遍的改变则是根本的、抛弃旧小编的!在斯维夫特2.0及从前的法子名是无需为第多少个参数设置标签的,所以率先个参数名称平时会放到到方法名称的最后,举个例子:

names.indexOf("Taylor")
"Taylor".writeToFile("filename", atomically:true, encoding:NSUTF8StringEncoding)
SKAction.rotateByAngle(CGFloat(M_PI_2), duration:10)
UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
overridefuncnumberOfSectionsInTableView(tableView:UITableView) ->IntfuncviewForZoomingInScrollView(scrollView:UIScrollView) ->UIView?
NSTimer.scheduledTimerWithTimeInterval(0.35, target:self, selector:#selector(createEnemy), userInfo:nil, repeats:true)

在斯维夫特3.0中有所的全体的竹签都以必须的,那也就意味着着法子名不再含有参数的片段。在实操中,正是措施名的最后一局部被移入到了括号之中。

names.indexOf("Taylor")
names.index(of:"Taylor")

"Taylor".writeToFile("filename", atomically:true, encoding:NSUTF8StringEncoding)
"Taylor".write(toFile:"somefile", atomically:true, encoding:NSUTF8StringEncoding)

SKAction.rotateByAngle(CGFloat(M_PI_2), duration:10)
SKAction.rotate(byAngle:CGFloat(M_PI_2), duration:10)

UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
UIFont.preferredFont(forTextStyle: UIFontTextStyleSubheadline)

override func numberOfSectionsInTableView(tableView:UITableView) ->Int
override func numberOfSections(in tableView:UITableView) ->Int

func viewForZoomingInScrollView(scrollView:UIScrollView) ->UIView?
func viewForZooming(in scrollView:UIScrollView) ->UIView?

NSTimer.scheduledTimerWithTimeInterval(0.35, target:self, selector:#selector(createEnemy), userInfo:nil, repeats:true)
NSTimer.scheduledTimer(timeInterval:0.35, target:self, selector:#selector(createEnemy), userInfo:nil, repeats:true)

但,照旧有一对连锁反应的措施:当我们连接受框架的时候,比方UIKit,那么些措施希望在 斯维夫特 3.0 中依旧沿用旧有的“无第一参数名”的条条框框。在Swift 2.2 中:

override func viewWillAppear(animated:Bool)

override func tableView(tableView:UITableView, numberOfRowsInSection section:Int) ->IntoverridefuncdidMoveToView(view:SKView)

override func traitCollectionDidChange(previousTraitCollection:UITraitCollection?)

func textFieldShouldReturn(textField:UITextField) ->Bool

在 Swift3.0中,他们都急需在首先参数前应用下划线标志它们选用ObjC代码,而不应用参数标签。

override func viewWillAppear(_animated:Bool)

override func tableView(_tableView:UITableView, numberOfRowsInSection section:Int) ->Int

override func didMoveToView(_view:SKView)

override func traitCollectionDidChange(_previousTraitCollection:UITraitCollection?)

func textFieldShouldReturn(_textField:UITextField) ->Bool

疏忽不要求的词

当斯威夫特在二零一四年3月被开源的时候,全新的API引导方针包蕴了多少个极其的词:“忽略 不须求 词语”,它引进了斯威夫特 3.0 中另二个一代天骄的改观,因为在格局名中那一个根本没有须要出现的辞藻将被移去。让大家看上面包车型地铁这几个swift 2.第22中学的代码:

letblue = UIColor.blueColor()

letmin = numbers.minElement()

attributedString.appendAttributedString(anotherString)

names.insert("Jane", atIndex:0)

UIDevice.currentDevice()

能看到代码中的难题吧?当我们使用UIColor的时候,blue当然是三个颜色,所以选取blueColor是多余的。当我们抬高叁本性质字符串到另一个的时候,那七个东东必将都以字符串,而不容许另叁个是“大象”对吧!所以,同样的代码在Swift3.0中正是:

letblue = UIColor.blue()

letmin = numbers.min()

attributedString.append(anotherString)

names.insert("Jane", at:0)

UIDevice.current()

正如您看看的,那一个改换让艺术名称更加短了。
这种转移在字符串的操作上效果分明,比较上边包车型地铁代码,你会意识Swift2.2和Swift 3.0中间,大家写入的代码真是少了。

"  Hello  ".stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet())
"  Hello  ".trimmingCharacters(in: .whitespacesAndNewlines())

"Taylor".containsString("ayl")
"Taylor".contains("ayl")

"1,2,3,4,5".componentsSeparatedByString(",")
"1,2,3,4,5".componentsSeparated(by:",")

myPath.stringByAppendingPathComponent("file.txt")
myPath.appendingPathComponent("file.txt")

"Hello, world".stringByReplacingOccurrencesOfString("Hello", withString:"Goodbye")
"Hello, world".replacingOccurrences(of:"Hello", with:"Goodbye")

"Hello, world".substringFromIndex(7)
"Hello, world".substring(from:7)

"Hello, world".capitalizedString
"Hello, world".capitalized

瞩目:capitalized 依旧是三个天性,但是lowercaseString 和 uppercaseString 万物更新成为艺术 lowercased() 和 uppercased()了。

再有三个Swift 3.0的章程是下边那样:
dismiss(animated:true, completion:nil)

您恐怕会想,大家要dismiss什么吧?斯威夫特3.0是既要增多第一参数的竹签,又要删减不须要的词,所以地点的代码实际是Swift2.第22中学的

dismissViewControllerAnimated(true, completion:nil)

具备一样效果的还大概有prepareForSegue方法,在Swift 3.0 中它成为了这么:

overridefuncprepare(forsegue:UIStoryboardSegue, sender:AnyObject?)

对此枚举和属性,驼峰大写前缀被替换到了驼峰小写前缀

固然与语法未有何样关系,不过大家对此类、结构、属性和枚举,始终根据着三个预订:类、结商谈枚举使用驼峰大写前缀,属性和参数名称使用驼峰小写前缀。那些约定也可以有差异,使用NSUTiggoLRequest(UENCOREL: someU讴歌ZDXL) 创制NSU冠道LRequest对象的时候,参数正是大写U福特ExplorerL。斯威夫特3重写了该方法为NSU帕杰罗LRequest(url: someU凯雷德L) ,也表示大家将会采纳webView.request?.url?.absoluteString格局来读取web view的U冠道L。

再有一部分是在品质部分,譬喻说CGColor或CIColor。是的,今后它将会变成cgColor和ciColor。

letred = UIColor.red().cgColor

这种变动实在提升了编码的一致性:全体的属性和参数应该都以以小写起来,未有两样!

再者,枚举也在发出着改造,从驼峰大写前缀改为驼峰小写前缀。那意味:枚举是二个数据类型,但是枚举值更近乎属性。然则,那表示苹果的枚举以往都以小写了。

UIInterfaceOrientationMask.Portrait// old
UIInterfaceOrientationMask.portrait// new

NSTextAlignment.Left// old
NSTextAlignment.left// new

SKBlendMode.Replace// old
SKBlendMode.replace// new

Swift 引入 C 函数

Swift3引进C函数的习性。举例,全部以CGContext早先的函数未来都被映射为CGContext对象上的属性方法,那样大家就能够不再利用令我们相当痛楚的CGContextSetFillColorWithColor()函数了。

swift 2.第22中学的代码:

let ctx = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x:0, y:0, width:512, height:512)
CGContextSetFillColorWithColor(ctx, UIColor.redColor().CGColor)
CGContextSetStrokeColorWithColor(ctx, UIColor.blackColor().CGColor)
CGContextSetLineWidth(ctx,10)
CGContextAddRect(ctx,rectangle)
CGContextDrawPath(ctx, .FillStroke)
UIGraphicsEndImageContext()

在Swift 3.0中CGContext被视作指标管理,大家能够直接调用方法了。

if let ctx = UIGraphicsGetCurrentContext() {
  letrectangle = CGRect(x:0, y:0, width:512, height:512)
  ctx.setFillColor(UIColor.red().cgColor)
  ctx.setStrokeColor(UIColor.black().cgColor)
  ctx.setLineWidth(10)
  ctx.addRect(rectangle)
  ctx.drawPath(using: .fillStroke)
  UIGraphicsEndImageContext()
}

留心:不管是斯威夫特 2.2照旧Swift 3.0 UIGraphicsGetCurrentContext()再次来到的是可选CGContext,所以在Swift3.0中央银行使CGContext对象的不二法门,必须先拆包。

C函数映射也存在于其余地方,比方读取CGPDFDocument的numberOfPages属性和CGAffineTransform。上边是新旧代码相比较:

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))

动词和排名

先让我们看一段代码

myArray.enumerate()
myArray.enumerated()

myArray.reverse()
myArray.reversed()

种种Swift3的修改章程都增加了d,代表那些值正被再次来到。还可能有正是在数组排序的事态下。swift 2.2 使用 sort()重返二个排序还的数组,而 sortInPlace()则达成内部排序。在Swift 3.0中 sort()变成了sorted(),sortInPlace()产生了sort()。那也就表示那Swift2.2中sort()会重返数组,而在斯维夫特 3.0中一向内部排序。

与 -- 操作符

自增自减是出自 C 的操作符,效能是对变量直接实行 1或 -1的操作:

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

唯独,在大家要挑选使用哪种操作符实行演算的时候,事情就变得复杂起来。无论是自增依然自减,都对应着三种写法:写在在变量在此以前,依旧在变量之后。它们的尾部完结其实都以有重回值的函数,是不是利用重返值取决于对运算符的重载。
那只怕会吓跑初学者,所以苹果移除了该特性——替代它的是复合加法运算( =)与减法运算(-=):

var i = 0
i  = 1
i -= 1

理之当然,你也能够采用普通的加法运算( )与减法运算(-),就算复合式运算符写起来要短一点:

i = i   1
i = i - 1

C 风格的 for 循环已成历史

事实上自增自减运算符用得最多的地点,照旧在 for 循环部分。移除该运算符意味着 for 循环的特色也随后远去了,因为在 for-in 的世界中,循环调整语句与范围限制用不上该操作符。
假定您有确定编制程序背景,那么输出 1 到 100 的数,你可能会如此写:

for (i = 1; i <= 10; i  ) { 
print(i)
}

在 Swift 3 中,已经不允许这种写法了,而应该写为(注意闭区间范围的写法):

for i in 1...10 { 
print(i)
}

只怕,你也得以使用 for-each 加闭包的写法:

(1...10).forEach { 
print($0)
}

一、通透到底移除在 Swift 2.2 就曾经弃用的特征

移除函数参数的 var标记

借使没有必要在函数内部对参数举行退换的话,函数参数平时都定义为常量。然则,在少数景况下,定义成变量会极其适合。在 Swift 2 中,你能够用 var关键字来将函数参数标识为变量。一旦参数用 var来标识,就能够生成一份变量的正片,如此便能在措施内部对变量实行改变了。
上面是一个求四个数的最大公约数的例子:

func gcd(var a: Int, var b: Int) -> Int {  
    if (a == b) { return a }  
    repeat { 
        if (a > b) { a = a - b 
            } else { b = b - a } 
    } while (a != b) 
 return a
}

本条算法的逻辑很简短:即便七个数相等,则赶回在这之中三个的值。不然,做大小相比,大的数减去小的数之后,将差值赋值给大的数,然后再将四个数作相比,截至它们相当于结束,最终回到个中一个的值。正如你所见到的,通过将 a和 b标志为变量,手艺在函数体里对七个数举行修改。
Swift 3 不在允许开采者那样来将参数标识为变量了,因为开荒者恐怕会在 var和 inout纠结不已。所以新型的 斯威夫特 版本中,就索性移除了函数参数标识 var 的风味。
如此,想要用 斯维夫特 3 来写上面的gcd函数,将要另辟蹊径了。你供给在函数内部创制一时变量来囤积参数:

func gcd(a: Int, b: Int) -> Int {  
      if (a == b) { return a }  
      var c = a 
      var d = b 
      repeat { 
          if (c > d) { 
              c = c - d 
        } else { 
              d = d - c 
        } 
    } while (c != d)  
return c
}

这一个特点在大家利用 Xcode 7.3 的时候就早就有报告警察方提示,在 Swift 3 中已将其通透到底移出。

函数参数标签的一致性

函数的参数列表底层完结其实是元组,所以即使元组结议和函数参数列表一样,你能够一向用元组来取代参数列表。就拿刚才的 gcd()
函数来讲,你能够这样调用:

gcd(8, b: 12)

您也足以如此调用:

let number = (8, b: 12)gcd(number)

正如你所看到的,在 Swift 第22中学,第4个参数无需带标签,而从第1个参数开始,就不能够不要带标签了。
这几个语法对初学者的话大概会招致狐疑,所以,要开始展览统一标签设计。在 斯维夫特 3 中,函数的调用要像上面那样:

gcd(a: 8, b: 12)

即便是第2个参数,也亟须带上标签。若是不带,Xcode 8 会直接报错。
您对那修改的首先个反应只怕是:「笔者哔!那本人代码改动得多大呀!」是的,这俨然是成吨的侵凌。所以苹果又提交了一种不用给第三个参数带标签的消除方案。在率先个参数前边加上一个下划线:

func gcd(_ a: Int, b: Int) -> Int { ... }

可是这么做,事情又好像回到了原点——第二个参数不用带标签了。使用这种办法,应该能自然水平上跌落 Swift 2 搬迁到 斯威夫特 3 上的悲苦。

1、弃用 与 -- 操作符

Selector 不再允许利用 String

让我们来创立三个按键,并给它加多叁个点击事件(没有需求分界面支持,直接动用 playground 就行):

// 1
import UIKit
import XCPlayground 
// 2
class Responder: NSObject {  
    func tap() { print("Button pressed") }
}
let responder = Responder()
// 3
let button = UIButton(type: .System)
button.setTitle("Button", forState: .Normal)
button.addTarget(responder, action: "tap", forControlEvents: .TouchUpInside)
button.sizeToFit()
button.center = CGPoint(x: 50, y: 25) 
// 4
let frame = CGRect(x: 0, y: 0, width: 100, height: 50)
let view = UIView(frame: frame)
view.addSubview(button)
XCPlaygroundPage.currentPage.liveView = view

让我们一步一步分析下方面的代码:
导入 UI基特与 XCPlayground 框架——要求创制三个开关,并在 playground 的 assistant editor 中举办展示。
注意:你供给在 Xcode 菜单栏上的 View -> Assistant Editor -> Show Assistant Editor 来拉开 assistant editor。

创设点击的触发事件,能在用户点击按键时,触发绑定的事件——那亟需基类为 NSObject,因为 selector 仅对 Objective-C 的方法使得。

声称开关,并布署相关属性。

宣示视图,给定合适的高低,将按键加多到视图上,最后显示在 playground 的 assistant editor 中。

让我们来看下给开关增多事件的代码:

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

这里按键的 selector 照旧写的字符串。固然字符串拼写错了,那程序会在运营时因找不到有关办法而夭亡。
为了化解编写翻译时期的隐私难点,斯威夫特 3 将字符串 selector 的写法改为了 #selecor()。那将同意编写翻译器提前检查办法名的拼写难题,而不用等到运营时。

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

如上便是有关移除特性的全体内容。接下来,让大家来探视语言当代化的有的亮点。

过去我们得以行使 与 -- 操作符来促成自增自减,现已丢掉。

不再是 String 的 key-path 写法

其一天性和上叁个很相像,可是那是用在键值编码(KVC)与键值观望(KVO)上的:

class Person: NSObject { 
  var name: String = ""  
  init(name: String) { 
      self.name = name 
    }
}
let me = Person(name: "Cosmin")
me.valueForKeyPath("name")

先是创设了 Person类,那是 KVC 的主要条件。然后用内定的结构器开首化贰个me,最终经过 KVC 来修改 name。同样,即使 KVC 中的键拼写错误,那全部就白瞎了 。
幸运的是,Swift 3 中就不会再出新这么些场地了。字符串的 key-path 写法被轮换为了 #keyPath():

class Person: NSObject { 
    var name: String = ""  
     init(name: String) { 
      self.name = name 
      }
}
let me = Person(name: "Cosmin")
me.value(forKeyPath: #keyPath(Person.name))
var i = 0
i  
  i
i--
--i

Foundation 去掉 NS前缀

作者们先来看看有 NS前缀时的写法,上边是一个第一名的 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)

如上代码应用了 Foundation 相关类来对文件中的 JSON 数据进行深入分析:NSBundle -> NSUOdysseyL -> NSData -> NSJSONSerialization。
在 斯威夫特 3 中,将移除 NS前缀,所以,深入分析流程产生了:Bundle -> UTucsonL -> Data -> JSONSerialization。

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

可以应用复合加法运算( =)与减法运算(-=),恐怕应用普通的加法运算( )与减法运算(-)达成平等的效果与利益。

M_PI还是 .pi

下边是多个已知半径求圆周长的事例:

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

在旧版本的 Swift 中,我们利用 M_PI 常量来代表 π。而在 斯威夫特 3 中,π 整合为了 Float,Double 与 CGFloat 两种样式:

Float.piDouble.piCGFloat.pi

据此地点求圆周长的事例,在 斯威夫特 3 中应当写为:

let r = 3.0
let circumference = 2 * Double.pi * r
let area = Double.pi * r * r

遵照项目揣摸,大家得以将品种前缀移除。更为轻松的版本如下:

let r = 3.0
let circumference = 2 * .pi * r
let area = .pi * r * r

2、取消C语言风格的for循环

GCD

Grand Central Dispatch(GCD)多用于消除网络央求时,阻塞主线程的 UI 刷新难点。那是用 C 写的,何况 API 对初学者也并不和谐,乃至想要创制个为主的异步线程也不得不及此写:

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

斯维夫特 3 撤消了这种冗余的写法,而采纳了越来越面向对象的点子:

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

作者们过去或者习贯下边风格的 for 循环,以后也已扬弃。

更 Swift 范的 Core Graphics

Core Graphics 是二个一定强劲的绘图框架,不过和 GCD 同样,它还是是 C 风格的 API:

let frame = CGRect(x: 0, y: 0, width: 100, height: 50) 
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 aView = View(frame: frame)

上边代码,首先创设了 view 的 frame,然后成立一个一而再自 UIView的 View类,重写 drawRect()方法来重绘 view 的剧情。
在 Swift 3 中,有两样的落到实处情势——对现阶段画布上下文解包,之后的具有绘制操作就都依照解包对象了:

let frame = CGRect(x: 0, y: 0, width: 100, height: 50) 
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 aView = View(frame: frame)

注意:在 view 调 drawRect()方法以前,上下文均为 nil,所以利用 guard关键字来管理

最近能够使用 for-in 循环,或许利用 for-each 加闭包的写法完结均等的效果。

动词与名词的命名约定

是时候介绍些立陶宛(Lithuania)语语法相关的退换了!斯维夫特 3 将艺术分为了两大类:一类是回来二个体面的值的措施,就像名词;一类是拍卖部分风云的,就好像动词。
来探视那些输出 10 到 1 的例证:

for i in (1...10).reverse() { print(i)}

我们利用了 reverse()方法来反向数组。Swift 3 中,改为用名词来做方法名——为它足够了 ed后缀:

for i in (1...10).reversed() { print(i)}

在元组中,最常见的出口数组内容的格局是:

var array = [1, 5, 3, 2, 4]
for (index, value) in array.enumerate() {
 print("(index   1) (value)")
}

斯维夫特 3 中,同样对有关的 enumerate()方法名做出了名词性的更改——同样增进了 ed后缀:

var array = [1, 5, 3, 2, 4]
for (index, value) in array.enumerated() { 
print("(index   1) (value)")
}

其余贰个事例是数组排序。上面是将数组升序排列的例子:

var array = [1, 5, 3, 2, 4]
let sortedArray = array.sort()
print(sortedArray)

斯威夫特 3 军长 sort()方法修改为了 sorted():

var array = [1, 5, 3, 2, 4]let sortedArray = array.sorted()print(sortedArray)

再让大家来探视直接对数组实行排序,并不是用中间量来接收是如何的。在 Swift2 中,你会像下边那样写:

var array = [1, 5, 3, 2, 4]array.sortInPlace()print(array)

我们使用了 sortInPlace()方法来对可变数组举办排序。斯维夫特 3 中,以为这种未有再次回到值,仅仅是拍卖排序的操作应该是动词行为。所以,应该利用了三个很基本的动词来说述这种操作——将 sortInPlace()重命名称叫了 sort():

var array = [1, 5, 3, 2, 4]array.sort()
print(array)
//for-in循环
for i in 1...10 {
    print(i)
}
//for-each循环
(1...10).forEach {
    print($0)
}

更 Swift 范的 API

斯威夫特 3 选择了更具有哲理性 API 设计方法——移除不供给的单词。所以,若是有些词是多余的,恐怕是能依靠上下文推测出来的,那就直接移除:

XCPlaygroundPage.currentPage
 改为 PlaygroundPage.current

button.setTitle(forState)
 改为 button.setTitle(for)

button.addTarget(action, forControlEvents)
 改为 button.addTarget(action, for)

NSBundle.mainBundle()
 改为 Bundle.main()

NSData(contentsOfURL)
 改为 URL(contentsOf)

NSJSONSerialization.JSONObjectWithData()
 改为 JSONSerialization.jsonObject(with)

UIColor.blueColor()
 改为 UIColor.blue()

UIColor.redColor()
 改为 UIColor.red()

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

枚举成员

Swift 3 将枚举成员当做属性来看,所以接纳小写字母开端并非原先的大写字母:

.System
 改为 .system

.TouchUpInside
 改为 .touchUpInside

.FillStroke
 改为 .fillStroke

.CGColor
 改为 .cgColor

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

@discardableResult

在 Swift 3 中,若无收到某艺术的再次回到值,Xcode 会报出警告。如下:

澳门新萄京官方网站 2

在上面的代码中,printMessage方法重临了一条信息给调用者。可是,这几个重返值并不曾被收取。这大概会存在潜在难点,所以编写翻译器在 Swift 3 中会给您报告警方告。
这种意况下,并不必须要接受再次回到值来裁撤警告。还能透过给艺术申明@discardableResult来实现解除指标:

override func viewDidLoad() { 
   super.viewDidLoad()  
    printMessage(message: "Hello Swift 3!")
} 
@discardableResult func printMessage(message: String) -> String { 
    let outputMessage = "Output : (message)" 
    print(outputMessage)  
    return outputMessage
}
var age = 22
add(age)
func add(var age:Int) {
    age  = 1
}

后天这种做法已经被放弃,Swift 3 不再允许开采者这样来将参数标识为变量了。

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

千古假若三个函数有多个参数,调用的时候第二个参数没有须求带标签,而从第二个参数开头,必须求带标签。

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
}

其一转换大概会招致大家的等级次序代码要拓展相当大的更改,毕竟涉及的地方重重。所以苹果又交给了一种不用给第4个参数带标签的消除方案。即在第叁个参数前面加上一个下划线。
(可是这些只是便于大家代码从 Swift2 迁移到 斯威夫特3 的一个折中方案,可以的话依旧提议将全数的参数都带上标签。)

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

5、函数评释和函数调用都供给括号来回顾参数

咱俩得以选取函数类型作为参数 ,对于三个参数是函数、再次回到值也是函数的函数。原本小编们只怕会这么写:

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

当这么特别难以阅读,极难看出参数在哪儿甘休,再次来到值又从哪里早先。在 斯威夫特3 中产生那样定义那么些函数:

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

6、Selector 不再允许选择 String

借使大家给按键增多多少个点击事件响应,点击后实施 tapped 函数。在此从前能够如此写:

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

但由于按键的 selector 写的是字符串。借使字符串拼写错了,那程序会在运作时因找不到有关措施而夭亡。所以 斯维夫特 3 将这种写法撤销,改成 #selecor()。那样就将允许编写翻译器提前检查格局名的拼写难题,而不用再等到运维时才察觉标题。

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

二、Swift 3 的新特色

1、内联系列函数sequence

斯维夫特 3 新扩展了七个全局函数:sequence(first: next:) 和 sequence(state: next:)。使用它们能够回去一个极其体系。下边是多少个简易的选用样例,更详细的介绍可以自身的另一篇小说:斯威夫特

  • 内联连串函数sequence介绍(附样例)

    // 从某多个树节点一贯进步遍历到根节点 for node in sequence(first: leaf, next: { $0.parent }) {     // 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 相关内容能够参见小编原来写的这篇小说:斯维夫特 - 反射(Reflection)的介绍与利用样例(附KVC介绍)
我们还可以继续选择 String 类型的 key-帕特h:

//用户类
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

在 Swift 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)

在 斯维夫特 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

在 斯维夫特 3 中在本来的 3 个访谈调节关键字 private、public、internal 外。又增多了2个新着重字 fileprivate、open。它们得以当作是对原来 private 和 public 的愈发划分。具体行使格局和介绍能够看小编写的另一篇小说:斯维夫特

  • 斯维夫特3新扩充的多少个访问调节关键字介绍(fileprivate、open)

三、一些语法的修改

1、数组排序:sort()与sorted()

过去数组排序的七个点子:sortInPlace() 和 sort(),今后个别更名成 sort() 和 sorted()
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、枚举成员成为小写字母起头

斯维夫特 3 将枚举成员当做属性来看,所以今后采取小写字母开始实际不是先前的大写字母。

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

6、@discardableResult

在 Swift 3 中,假如二个措施有重回值。而调用的时候从不接受该形式的重回值,Xcode 会报出警告,告诉你那大概会设有潜在难点。

澳门新萄京官方网站 3

而外能够经过接收重回值消除警告。还足以经过给艺术申明 @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()
    }
}

初稿出自:航歌网

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:澳门新萄京官方网站Swift3新特性汇总,的一些区

关键词: