的一些组别,Swift三新特色汇总

事先 Apple 在 WWDC 樱笋时将 Swift 3 整合进了 Xcode 八 beta
中,而前一个月苹果公布了 斯威夫特 叁 的正式版。那也是自 2014年初Apple开源Swift之后,首个公布的重要性版本(斯威夫特 叁.0),该版本达成了
Swift 演变进度中所切磋并透过的90八个建议。那里小编对 斯维夫特 3的新特征、新变化进行1个总括。

事先 Apple 在 WWDC 阳春将 斯维夫特 3 整合进了 Xcode 八 beta
中,而前些时间苹果公布了 Swift 三 的正式版。那也是自 20一5年终Apple开源Swift之后,第3个公布的重要版本(Swift 叁.0),该版本达成了
斯维夫特 演变进度中所研究并由此的90多少个建议。那里自身对 斯维夫特 3的新特征、新转换进行三个总计。

从前 Apple 在 WWDC 三月将 Swift 3 整合进了 Xcode 八 beta
中,而上个月苹果公布了 Swift 三 的正式版。这也是自 20一五年初Apple开源Swift之后,第二个宣布的基本点版本(Swift 三.0),该版本达成了
斯维夫特 衍变进度中所商讨并透过的90七个提出。那里小编对 Swift 3的新特征、新变化进行一个总括。

一、透顶移除在 斯维夫特 二.2 就已经弃用的本性

这么些特色在大家利用 Xcode 7.3 的时候就已经有报告警察方提示,在 斯威夫特 三中已将其到底移出。
1、弃用 ++ 与 — 操作符

千古大家得以采用 ++ 与 — 操作符来促成自增自减,现已舍弃。

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

能够行使复合加法运算(+=)与减法运算(-=),或许利用普通的加法运算(+)与减法运算(-)落成均等的成效。
二、撤废C语言风格的for循环
咱俩过去恐怕习于旧贯上边风格的 for 循环,今后也已扬弃。
到现在得以运用 for-in 循环,或许选拔 for-each 加闭包的写法完成均等的意义。

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

叁、移除函数参数的 var 标志
在 Swift 函数中,参数私下认可是常量。过去得以在参数前加关键字 var
将其定义为变量,那样函数内部就足以对该参数进行修改(外部的参数任然不会被退换)。

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

明日那种做法已经被遗弃,Swift 3不再允许开垦者那样来将参数标志为变量了。
4、全体函数参数都必须带上标签
千古假诺3个函数有七个参数,调用的时候第贰个参数无需带标签,而从第二个参数伊始,必供给带标签。

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
}

这一个变化可能会招致大家的档期的顺序代码要拓展十分大的改观,毕竟涉及的地点重重。所以苹果又交给了一种不用给第3个参数带标签的消除方案。即在率先个参数前边加上三个下划线。(然则那些只是惠及大家代码从
Swift2 迁移到 Swift3的二个折中方案,能够的话依旧提出将全数的参数都带上标签。)

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

5、函数表明和函数调用都急需括号来回顾参数
****我们能够采用函数类型作为参数
,对于2个参数是函数、重回值也是函数的函数。原来笔者们大概会这么写:

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

澳门葡京备用网址 ,当这么丰富麻烦阅读,极不美观出参数在什么地方甘休,重临值又从何地初阶。在 Swift三 中形成那样定义那么些函数:

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

6、Selector 不再允许行使 String
假诺大家给开关增添二个点击事件响应,点击后实践 tapped
函数。在此以前能够如此写:

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

但鉴于开关的 selector
写的是字符串。假诺字符串拼写错了,那程序会在运行时因找不到有关办法而夭亡。所以
Swift 叁 将那种写法取消,改成
#selecor()。那样就将允许编写翻译器提前检查方式名的拼写难点,而不用再等到运行时才意识难题。

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

2、Swift 3 的新特色

一、内联体系函数sequence
****Swift 叁 新增了多少个全局函数:sequence(first: next:) 和
sequence(state: next:)。使用它们得以回到2个Infiniti体系。

// 从某一个树节点一直向上遍历到根节点
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.
}

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

在 斯威夫特 叁 中,将移除 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

在 斯维夫特 三 中,π 提供了 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,作者原本写过1篇相关小说:斯维夫特 – 二十多线程达成格局(3) – Grand
Central Dispatch(GCD)过去写法采取 C
语言的品格,初学者或然会相当的小适应。比方创设3个简练的异步线程:

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

陆、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 三 中在本来的 三 个访问调节关键字 private、public、internal
外。又增添了一个新注重字 fileprivate、open。它们能够作为是对原本 private
和 public 的愈益细分。具体行使方式和介绍可以看自身写的另壹篇小说:Swift

  • Swift3新扩充的七个访问调节关键字介绍(fileprivate、open)
    叁、一些语法的改造

一、数组排序: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)

四、移除了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
在 斯维夫特 三中,借使1个主意有重返值。而调用的时候从不收到该措施的重临值,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()
    }
}

七、斯维夫特赋值运算符,溢出运算符, 空合并运算符 ??

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

        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中又发出了变化,而那二次的改变则是通透到底的、吐弃旧作者的!在斯维夫特二.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)

在斯维夫特三.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,这几个措施希望在
斯威夫特 三.0 中依旧沿用旧有的“无第一参数名”的规则。在斯维夫特 二.二 中:

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

在 Swift三.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

忽略不需求的词

当斯维夫特在20一伍年1月被开源的时候,斩新的API指点布署包罗了四个可怜的词:“忽略
不必要 词语”,它引入了斯威夫特 3.0
中另三个高大的变动,因为在措施名中这些根本未曾须求出现的用语将被移去。让我们看上边包车型大巴那个swift
贰.第22中学的代码:

letblue = UIColor.blueColor()

letmin = numbers.minElement()

attributedString.appendAttributedString(anotherString)

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

UIDevice.currentDevice()

能见到代码中的难题呢?当大家选取UIColor的时候,blue当然是贰个颜料,所以选用blueColor是多余的。当大家抬高2个属性字符串到另1个的时候,那四个东东自然都是字符串,而不容许另2个是“大象”对啊!所以,一样的代码在斯威夫特叁.0中就是:

letblue = UIColor.blue()

letmin = numbers.min()

attributedString.append(anotherString)

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

UIDevice.current()

正如您见到的,那么些改动让艺术名称更加短了。
那种转移在字符串的操作上效果显明,比较上面包车型大巴代码,你会发觉Swift二.二和Swift 三.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()了。

还有二个斯维夫特 三.0的方法是下边那样:
dismiss(animated:true, completion:nil)

您或许会想,大家要dismiss什么吗?斯维夫特三.0是既要增加第1参数的价签,又要刨除不须要的词,所以地点的代码实际是Swift二.第22中学的

dismissViewControllerAnimated(true, completion:nil)

不无同样效劳的还有prepareForSegue方法,在斯维夫特 3.0 中它产生了如此:

overridefuncprepare(forsegue:UIStoryboardSegue, sender:AnyObject?)

对此枚举和总体性,驼峰大写前缀被替换来了驼峰小写前缀

即使与语法未有啥样关系,不过大家对于类、结构、属性和枚举,始终遵从着二个预约:类、结议和枚举使用驼峰大写前缀,属性和参数名称使用驼峰小写前缀。那么些约定也有例外,使用NSU库罗德LRequest(U冠道L:
someU君越L) 创立NSU奥迪Q5LRequest对象的时候,参数正是大写UOdysseyL。Swift3重写了该措施为NSU奥迪Q5LRequest(url: someURAV4L)
,也意味着我们将会采纳webView.request?.url?.absoluteString方式来读取web
view的ULacrosseL。

再有一对是在品质部分,比如说CGColor或CIColor。是的,今后它将会形成cgColor和ciColor。

letred = UIColor.red().cgColor

那种改换真的提升了编码的一致性:所有的习性和参数应该都是以小写起来,没有两样!

而且,枚举也在发生着改造,从驼峰大写前缀改为驼峰小写前缀。那意味着:枚举是1个数据类型,不过枚举值更就如属性。但是,那象征苹果的枚举以往都以小写了。

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

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

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

Swift 引入 C 函数

斯维夫特三引进C函数的属性。比如,全部以CGContext早先的函数未来都被映射为CGContext对象上的性质方法,那样我们就足以不再利用令我们尤其痛心的CGContextSetFillColorWithColor()函数了。

的一些组别,Swift三新特色汇总。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()

在斯维夫特 叁.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还是Swift 三.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))

动词和排行

先让我们看1段代码

myArray.enumerate()
myArray.enumerated()

myArray.reverse()
myArray.reversed()

每种Swift三的更动章程都加多了d,代表那个值正被再次来到。还有就是在数组排序的图景下。swift
二.二 使用 sort()重回3个排序还的数组,而
sortInPlace()则贯彻内部排序。在斯威夫特 三.0中
sort()产生了sorted(),sortInPlace()产生了sort()。那也就象征那斯维夫特二.第22中学sort()会重临数组,而在斯威夫特 三.0中央直机关接内部排序。



一、通透到底移除在 斯威夫特 二.二 就早已弃用的特点

壹、通透到底移除在 斯维夫特 2.二 就曾经弃用的特色

一、通透到底移除在 Swift 二.二 就早已弃用的特征

那么些特征在大家使用 Xcode 柒.三 的时候就曾经有报告警察方提醒,在 斯维夫特 3中已将其到底移出。

这几个特色在我们选拔 Xcode 7.3 的时候就已经有报告警察方提示,在 Swift 叁中已将其根本移出。

那个特色在大家选用 Xcode 七.3 的时候就已经有报告警方提示,在 Swift 三中已将其根本移出。

1、弃用 ++ 与 — 操作符

1、弃用 ++ 与 — 操作符

1、弃用 ++ 与 — 操作符

过去我们能够使用 ++ 与 — 操作符来得以落成自增自减,现已放弃。

过去大家能够使用 ++ 与 — 操作符来兑现自增自减,现已废弃。

过去我们可以运用 ++ 与 — 操作符来完成自增自减,现已放弃。

var i = 0

i++

++i

i–

–i

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

能够使用复合加法运算(+=)与减法运算(-=),可能应用普通的加法运算(+)与减法运算(-)落成均等的效率。

能够使用复合加法运算(+=)与减法运算(-=),或许选择普通的加法运算(+)与减法运算(-)落成均等的意义。

能够应用复合加法运算(+=)与减法运算(-=),恐怕采取普通的加法运算(+)与减法运算(-)达成平等的职能。

二、打消C语言风格的for循环

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

贰、撤销C语言风格的for循环

作者们过去也许习贯上边风格的 for 循环,现在也已遗弃。

咱俩过去或然习贯上边风格的 for 循环,现在也已遗弃。

我们过去说不定习于旧贯上面风格的 for 循环,未来也已扬弃。

现行反革命得以应用 for-in 循环,恐怕利用 for-each 加闭包的写法完成均等的效应。

目前能够使用 for-in 循环,可能接纳 for-each 加闭包的写法达成均等的效用。

今后可以运用 for-in 循环,可能选择 for-each 加闭包的写法落成均等的效果。

//for-in循环for i in 1…10 {

print(i)

}//for-each循环(1…10).forEach {

print($0)

}

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

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

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

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

在 Swift 函数中,参数默许是常量。过去得以在参数前加关键字 var
将其定义为变量,那样函数内部就能够对该参数实行改造(外部的参数任然不会被改造)。

在 Swift 函数中,参数暗中认可是常量。过去能够在参数前加关键字 var
将其定义为变量,那样函数内部就足以对该参数进行修改(外部的参数任然不会被退换)。

在 Swift 函数中,参数暗中同意是常量。过去得以在参数前加关键字 var
将其定义为变量,这样函数内部就足以对该参数实行退换(外部的参数任然不会被更改)。

var age = 22

add(age)

func add(var age:Int) {

age += 1

}

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

明天那种做法早就被撤废,Swift 叁 不再允许开拓者那样来将参数标识为变量了。

今昔这种做法早就被撤销,Swift 三 不再允许开垦者那样来将参数标识为变量了。

近来那种做法早就被撇下,Swift 三 不再允许开荒者那样来将参数标志为变量了。

4、全体函数参数都不能不带上标签

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

肆、全部函数参数都无法不带上标签

千古一旦一个函数有两个参数,调用的时候第一个参数无需带标签,而从第一个参数初阶,必须求带标签。

过去一经2个函数有五个参数,调用的时候第二个参数无需带标签,而从首个参数先河,必须要带标签。

千古一经二个函数有多少个参数,调用的时候第壹个参数无需带标签,而从第贰个参数开首,必供给带标签。

let number = additive(8, b: 12)

func additive(a:Int, b:Int) -> Int{

return a + b

}

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

近年来为了保障函数参数标签的1致性,全数参数都无法不带上标签。

当今为了保障函数参数标签的一致性,全体参数都不可能不带上标签。

现行反革命为了确定保证函数参数标签的壹致性,全部参数都必须带上标签。

let number = additive(a: 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
}
let number = additive(a: 8, b: 12)
func additive(a:Int, b:Int) -> Int{
    return a + b
}

其一转换只怕会招致大家的品种代码要实行不小的改观,终归涉及的地点重重。所以苹果又交给了1种不用给第一个参数带标签的消除方案。即在率先个参数前边加上三个下划线。

那几个变化或者会招致大家的等级次序代码要拓展相当的大的退换,终究涉及的地点重重。所以苹果又交给了壹种不用给第壹个参数带标签的缓和方案。即在第一个参数前边加上1个下划线。
(可是那一个只是方便我们代码从 Swift贰 迁移到 斯维夫特3的3个折中方案,能够的话照旧提出将全部的参数都带上标签。)

其一调换可能会招致我们的等级次序代码要拓展相当大的改观,终究涉及的地点重重。所以苹果又交给了1种不用给第二个参数带标签的缓和方案。即在第贰个参数前边加上八个下划线。
(然而那些只是有利我们代码从 斯威夫特2 迁移到 斯维夫特三的三个折中方案,能够的话照旧提议将有着的参数都带上标签。)

(可是这么些只是便宜我们代码从 斯威夫特贰 迁移到 斯威夫特3的五个折中方案,能够的话依然建议将具有的参数都带上标签。)

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

let number = additive(8, b: 12)

func additive(_ a:Int, b:Int) -> Int{

return a + b

}

伍、函数注脚和函数调用都亟待括号来回顾参数

伍、函数注解和函数调用都急需括号来回顾参数

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

作者们得以选拔函数类型作为参数
,对于3个参数是函数、重返值也是函数的函数。原来作者们兴许会这么写:

咱俩得以应用函数类型作为参数
,对于三个参数是函数、再次回到值也是函数的函数。原来小编们大概会如此写:

我们能够动用函数类型作为参数
,对于1个参数是函数、重回值也是函数的函数。原来笔者们恐怕会这么写:

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

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

当那样充裕麻烦阅读,极不赏心悦目出参数在何地停止,重返值又从哪儿开端。在 Swift三 中变为那样定义那些函数:

当如此丰裕不便阅读,非常丑出参数在何地停止,重返值又从何地先河。在 Swift三 中成为那样定义这么些函数:

当这么不行难以阅读,非常不美观出参数在哪儿甘休,再次回到值又从哪里起始。在 Swift3 中变为那样定义那么些函数:

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

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

陆、Selector 不再允许行使 String

6、Selector 不再允许选用 String

六、Selector 不再允许行使 String

若果大家给开关增多一个点击事件响应,点击后实践 tapped
函数。从前能够这么写:

若是大家给开关增添多个点击事件响应,点击后进行 tapped
函数。从前可以这么写:

只要大家给按键增添四个点击事件响应,点击后实施 tapped
函数。从前能够这么写:

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

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

但鉴于开关的 selector
写的是字符串。假使字符串拼写错了,那程序会在运维时因找不到有关办法而夭折。所以
斯威夫特 三 将那种写法撤除,改成
#selecor()。那样就将允许编写翻译器提前检查措施名的拼写难点,而不用再等到运营时才开采标题。

但鉴于按键的 selector
写的是字符串。假设字符串拼写错了,那程序会在运行时因找不到有关办法而夭折。所以
斯维夫特 三 将那种写法撤销,改成
#selecor()。那样就将允许编写翻译器提前检查措施名的拼写难点,而不用再等到运转时才发觉标题。

但鉴于按键的 selector
写的是字符串。假诺字符串拼写错了,那程序会在运转时因找不到有关办法而夭折。所以
Swift 三 将那种写法裁撤,改成
#selecor()。这样就将允许编写翻译器提前检查办法名的拼写难题,而不用再等到运营时才开掘标题。

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

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

贰、斯维夫特 三 的新特色

二、Swift 三 的新特性

二、斯维夫特 三 的新性子

1、内联连串函数sequence

一、内联类别函数sequence

壹、内联连串函数sequence

斯维夫特 三 新增加了多少个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们得以重返三个最棒种类。下边是贰个粗略的应用样例,更详尽的牵线能够自己的另一篇小说:斯维夫特

Swift 3 新扩展了多个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们能够回去2个极致系列。上面是一个粗略的选择样例,更详细的介绍能够自个儿的另一篇著作:斯威夫特

**Swift 三 新扩展了多个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们得以回到二个可是类别。下边是3个简单易行的应用样例,更详实的介绍能够自小编的另一篇文章:斯威夫特

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

    // 从某二个树节点平素向上遍历到根节点
    for node in sequence(first: leaf, next: { $0.parent }) {
        // node is leaf, then leaf.parent, then leaf.parent.parent, etc.
    }// 遍历出全数的二的n次方数(不思量溢出)
    for value in sequence(first: 壹, next: { $0 * 2 }) {
        // value is 1, then 2, then 4, then 8, etc.
    }

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

    // 从某三个树节点平昔升高遍历到根节点
    for node in sequence(first: leaf, next: { $0.parent }) {
        // node is leaf, then leaf.parent, then leaf.parent.parent, etc.
    }// 遍历出具备的二的n次方数(不思量溢出)
    for value in sequence(first: 一, next: { $0 * 2 }) {
        // value is 1, then 2, then 4, then 8, etc.
    }

  • 内联体系函数sequence介绍(附样例)**

2、 key-path不再只可以利用String

2、 key-path不再只可以选用String

// 从某三个树节点平素发展遍历到根节点

for node in sequence(first: leaf, next: { $0.parent }) {

// node is leaf, then leaf.parent, then leaf.parent.parent, etc.

}

// 遍历出具备的贰的n次方数(不思虑溢出)

for value in sequence(first: 1, next: { $0 * 2 }) {

// value is 1, then 2, then 4, then 8, etc.

}

以此是用在键值编码(KVC)与键值观看(KVO)上的,具体 KVC、KVO
相关内容能够参考作者原来写的那篇小说:斯威夫特 –
反射(Reflection)的介绍与运用样例(附KVC介绍)
笔者们还是能一而再应用 String 类型的 key-Path:

本条是用在键值编码(KVC)与键值观望(KVO)上的,具体 KVC、KVO
相关内容能够参见小编原本写的那篇作品:Swift –
反射(Reflection)的牵线与应用样例(附KVC介绍)
咱俩依然得以一连使用 String 类型的 key-Path:

贰、 key-path不再只好选择String

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

本条是用在键值编码(KVC)与键值观望(KVO)上的,具体 KVC、KVO
相关内容可以参考小编原本写的那篇小说:斯维夫特 –
反射(Reflection)的介绍与运用样例(附KVC介绍)

但提出利用新扩张的 #key帕特h()
写法,这样能够免止大家因为拼写错误而引发难题。

但提出采纳激增的 #keyPath()
写法,那样能够免止大家因为拼写错误而引发难点。

我们还能够再而三利用 String 类型的 key-Path:

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

//用户类

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 前缀

3、Foundation 去掉 NS 前缀

3、Foundation 去掉 NS 前缀

比如说过去大家运用 Foundation 相关类来对文本中的 JSON
数据开始展览解析,这么写:

诸如过去我们采纳 Foundation 相关类来对文件中的 JSON
数据开始展览辨析,这么写:

诸如过去我们运用 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)
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)

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)

在 斯维夫特 叁 中,将移除 NS 前缀,就改为了:

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

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

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

4、除了M_PI 还有 .pi

4、除了M_PI 还有 .pi

在过去,大家应用 M_PI 常量来代表 π。所以据他们说半径求周长代码如下:

在过去,我们应用 M_PI 常量来代表 π。所以依赖半径求周长代码如下:

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

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

let r = 3.0

let circumference = 2 * M_PI * r

在 Swift ③ 中,π 提供了 Float,Double 与 CGFloat
二种样式(Float.pi、Double.pi、CGFloat.pi),所以求周长还足以那样写:

在 斯威夫特 叁 中,π 提供了 Float,Double 与 CGFloat
三种情势(Float.pi、Double.pi、CGFloat.pi),所以求周长还能如此写:

在 Swift 三 中,π 提供了 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
let r =  3.0
let circumference = 2 * Double.pi * r
//我们还可以将前缀省略,让其通过类型自动推断
let r = 3.0
let circumference = 2 * .pi * r

let r =  3.0

let circumference = 2 * Double.pi *
r//大家还可以够将前缀省略,让其经过品种自动测算let r = 三.0

let circumference = 2 * .pi * r

5、简化GCD的写法

5、简化GCD的写法

5、简化GCD的写法

有关 GCD,小编本来写过一篇有关文章:斯维夫特 – 多线程完成情势(三) – Grand
Central Dispatch(GCD)
千古写法接纳 C
语言的品格,初学者恐怕会十分的小适应。比方创造3个总结的异步线程:

有关 GCD,小编本来写过1篇有关小说:斯维夫特 – 十2线程完结方式(三) – Grand
Central Dispatch(GCD)
千古写法选用 C
语言的作风,初学者或者会十分小适应。比如创制3个简练的异步线程:

至于 GCD,作者原来写过一篇相关文章:斯维夫特 – 10二线程完毕形式(三) – Grand
Central Dispatch(GCD)

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

过去写法选择 C
语言的风格,初学者大概会非常小适应。举个例子成立二个简短的异步线程:

Swift 叁 裁撤了这种冗余的写法,而利用了进一步面向对象的法子:

斯维夫特 三 撤消了那种冗余的写法,而采纳了特别面向对象的艺术:

let queue = dispatch_queue_create(“Swift 2.2”, nil)

dispatch_async(queue) {

print(“Swift 2.2 queue”)

}

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

Swift 叁 撤除了那种冗余的写法,而使用了尤其面向对象的办法:

陆、Core Graphics的写法也愈来愈面向对象化

六、Core Graphics的写法也更为面向对象化

let queue = DispatchQueue(label: “Swift 3”)

queue.async {

print(“Swift 3 queue”)

}

Core Graphics 是多个万分庞大的绘图框架,可是和 GCD 一样,它原本的 API
也是 C 语言风格的。
比如我们要成立一个 view,其里面背景使用 Core Graphics
进行绘图(棕黑边框,鲜黄背景)。过去大家那样写:

Core Graphics 是贰个一定强大的绘图框架,但是和 GCD 同样,它原先的 API
也是 C 语言风格的。
譬如我们要创设二个 view,当中间背景使用 Core Graphics
举办绘图(深绿边框,中湖蓝背景)。过去大家如此写:

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

Core Graphics 是2个万分庞大的绘图框架,可是和 GCD 同样,它原先的 API
也是 C 语言风格的。

在 斯维夫特 3中改正了写法,只要对日前画布上下文解包,之后的有所绘制操作就都依据解包对象。

在 斯维夫特 3中改良了写法,只要对当前画布上下文解包,之后的具备绘制操作就都依照解包对象。

比如说我们要创设1个 view,在那之中间背景使用 Core Graphics
实行绘图(乌紫边框,浅绛红背景)。过去我们那样写:

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

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)

7、新扩大的访问调整关键字:fileprivate、open

七、新添的访问调节关键字:fileprivate、open

在 斯维夫特 3中改良了写法,只要对当前画布上下文解包,之后的有着绘制操作就都根据解包对象。

在 斯威夫特 3 中在原来的 三 个访问调整关键字 private、public、internal
外。又增加了3个新珍视字 fileprivate、open。它们能够当做是对原来 private
和 public 的一发细分。具体使用情势和介绍能够看小编写的另一篇小说:Swift

在 Swift 3 中在原本的 三 个访问调控关键字 private、public、internal
外。又增多了3个新入眼字 fileprivate、open。它们能够看做是对原来 private
和 public 的一发划分。具体采取格局和介绍能够看本人写的另壹篇小说:斯威夫特

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)

  • Swift叁新扩充的五个访问调整关键字介绍(fileprivate、open)
  • 斯威夫特三新扩张的七个访问调节关键字介绍(fileprivate、open)

7、新增添的访问调控关键字:fileprivate、open

3、一些语法的退换

三、一些语法的改变

在 Swift 三 中在原本的 3 个访问调控关键字 private、public、internal
外。又增加了1个新入眼字 fileprivate、open。它们能够用作是对原本 private
和 public 的愈益细分。具体使用情势和介绍能够看自身写的另壹篇小说:Swift

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

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

  • 斯维夫特三新添的五个访问调整关键字介绍(fileprivate、open)

千古数组排序的两个办法:sortInPlace() 和 sort(),将来分别更名成 sort()
和 sorted()
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]
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]

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

2、reversed()与enumerated()

2、reversed()与enumerated()

过去数组排序的八个章程:sortInPlace() 和 sort(),以往各自更名成 sort()
和 sorted()

过去 reverse() 方法达成数组反转,enumerate()
方法完成遍历。现那八个措施都加上 ed 后缀(reversed、enumerated)

过去 reverse() 方法实现数组反转,enumerate()
方法落成遍历。现那七个主意都增添 ed 后缀(reversed、enumerated)

sort() 是直接对目的数组实行排序。sorted()
是回来一个排序后的数组,原数组不改变。

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

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]

3、CGRect、CGPoint、CGSize

3、CGRect、CGPoint、CGSize

2、reversed()与enumerated()

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

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

过去 reverse() 方法落成数组反转,enumerate()
方法落成遍历。现那两个法子都丰硕 ed 后缀(reversed、enumerated)

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

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

}

四、移除了API中剩下的单词

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

3、CGRect、CGPoint、CGSize

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

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

5、枚举成员成为小写字母最先

5、枚举成员成为小写字母早先

//Swift 2let frame = CGRectMake(0, 0, 20, 20)

let point = CGPointMake(0, 0)

let size = CGSizeMake(20, 20)//Swift 3let frame = CGRect(x: 0, y: 0,
width: 20, height: 20)

let point = CGPoint(x: 0, y: 0)

let size = CGSize(width: 20, height: 20)

斯威夫特 叁将枚举成员当做属性来看,所以未来应用小写字母伊始而不是从前的大写字母。

斯维夫特 3将枚举成员当做属性来看,所以今后利用小写字母开首而不是先前的大写字母。

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

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

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

6、@discardableResult

6、@discardableResult

五、枚举成员成为小写字母初阶

在 斯维夫特 三中,若是一个措施有再次来到值。而调用的时候未有吸收该方法的重返值,Xcode
会报出警告,告诉您那说不定会设有潜在难点。

在 斯维夫特 三中,如若多个形式有再次来到值。而调用的时候从不抽出该办法的重回值,Xcode
会报出警告,告诉你那可能会设有潜在难题。

斯维夫特 三将枚举成员当做属性来看,所以以后选取小写字母开端而不是原先的大写字母。

澳门葡京备用网址 2

澳门葡京备用网址 3

.system //过去是:.System

.touchUpInside //过去是:.TouchUpInside

.fillStroke //过去是:.FillStroke

.cgColor //过去是:.CGColor

除了这些之外能够透过接收重临值消除警告。还能由此给艺术申明 @discardableResult
来落成解决目标。

除开能够通过接收重回值消除警告。还足以经过给艺术表明 @discardableResult
来完毕化解目标。

6、@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()
    }
}
.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()
    }
}

在 斯威夫特 3中,假诺1个格局有重返值。而调用的时候未有吸收该方法的重临值,Xcode
会报出警告,告诉您那只怕会设有潜在难点。

最初的文章出自:航歌网

原稿出自:航歌网

澳门葡京备用网址 4

除去能够由此接收重回值消除警告。还是能通过给艺术注明 @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()

}

}

相关文章

发表评论

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

*
*
Website