的局地分歧,斯维夫特三新特征汇总

By admin in 4858.com on 2019年4月23日

事先 Apple 在 WWDC 晚春将 斯威夫特 3 整合进了 Xcode 8 beta
中,而前些日子苹果发表了 斯维夫特 叁 的正式版。那也是自 201伍年终Apple开源斯威夫特之后,第多个公布的基本点版本(斯维夫特 三.0),该版本达成了
Swift 演化进程中所商讨并经过的90多少个提议。那里本身对 Swift 三的新特色、新转变实行1个计算。

前边 Apple 在 WWDC 三春将 斯威夫特 3 整合进了 Xcode 八 beta
中,而前些时间苹果发布了 Swift 3 的正式版。那也是自 二〇一六年终Apple开源Swift之后,第10个发布的严重性版本(斯威夫特 3.0),该版本实现了
斯维夫特 衍变进程中所斟酌并通过的90八个建议。那里本人对 斯维夫特 叁的新特点、新转换进行多个总括。

在此以前 Apple 在 WWDC 晚春将 Swift 3 整合进了 Xcode 八 beta
中,而前一个月苹果宣布了 斯维夫特 三 的正式版。那也是自 20一5年初Apple开源斯威夫特之后,第多少个发表的关键版本(斯维夫特 三.0),该版本完成了
斯维夫特 演变进度中所切磋并透过的90多少个建议。那里作者对 斯威夫特 三的新特色、新转变进行一个计算。

1、透顶移除在 斯维夫特 二.二 就曾经弃用的性状

这几个特点在我们运用 Xcode 7.叁 的时候就早已有报告警察方提示,在 Swift 三中已将其深透移出。
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、全部函数参数都必须带上标签
过去借使贰个函数有多少个参数,调用的时候第二个参数无需带标签,而从第三个参数初阶,必须求带标签。

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
}

本条变化或者会导致大家的类型代码要开始展览十分大的转移,究竟涉及的地点重重。所以苹果又提交了1种不用给第贰个参数带标签的消除方案。即在率先个参数前边加上二个下划线。(不过那个只是福利大家代码从
Swift2 迁移到 Swift三的多少个折中方案,能够的话照旧提议将具有的参数都带上标签。)

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

5、函数证明和函数调用都亟待括号来回顾参数
****咱俩得以接纳函数类型作为参数
,对于3个参数是函数、再次来到值也是函数的函数。原来我们兴许会如此写:

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

当那样丰裕不便阅读,极不赏心悦目出参数在什么地方甘休,再次回到值又从哪儿开头。在 Swift三 中变为那样定义那个函数:

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

陆、Selector 不再允许行使 String
若是我们给开关增加二个点击事件响应,点击后实行 tapped
函数。以前能够这样写:

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

但鉴于按键的 selector
写的是字符串。假设字符串拼写错了,那程序会在运维时因找不到相关方法而夭折。所以
Swift 三 将这种写法撤废,改成
#selecor()。那样就将同意编写翻译器提前检查办法名的拼写难点,而不用再等到运营时才意识难题。

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

2、Swift 叁 的新性子

1、内联连串函数sequence
****斯威夫特 3 新添了四个全局函数:sequence(first: next:) 和
sequence(state: next:)。使用它们能够回来3个万分体系。

// 从某一个树节点一直向上遍历到根节点
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
相关内容能够参考小编原本写的那篇文章:斯维夫特 –
反射(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 三 中,将移除 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,笔者原来写过1篇相关文章:斯威夫特 – 十二线程达成方式(3) – Grand
Central Dispatch(GCD)过去写法采取 C
语言的作风,初学者或然会不大适应。举个例子创造一个简单易行的异步线程:

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

Swift 三 撤销了那种冗余的写法,而利用了特别面向对象的法子:

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

陆、Core Graphics的写法也愈加面向对象化
Core Graphics 是一个11分强劲的绘图框架,但是和 GCD 同样,它原本的 API
也是 C 语言风格的。比方大家要开创3个 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 三 中在原始的 三 个访问调节关键字 private、public、internal
外。又增加了二个新注重字 fileprivate、open。它们得以看做是对原来 private
和 public 的愈发划分。具体选拔办法和介绍能够看我写的另1篇小说:Swift

  • Swift3新扩张的八个访问调控关键字介绍(fileprivate、open)
    3、一些语法的修改

1、数组排序:sort()与sorted()
千古数组排序的四个主意:sortInPlace() 和 sort(),今后个别更名成 sort()
和 sorted()sort() 是一直对目的数组进行排序。sorted()
是重回1个排序后的数组,原数组不改变。

 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

⑤、枚举成员成为小写字母伊始
Swift 三将枚举成员当做属性来看,所以未来使用小写字母开始而不是原先的大写字母。

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

6、@discardableResult
在 斯威夫特 三中,尽管三个方法有重临值。而调用的时候从不收到该办法的重回值,Xcode
会报出警告,告诉你那或然会存在潜在难点。!

4858.com 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))
    }

在斯威夫特 二.0
中调用函数和艺术已经做出了转移,在三.0中又发生了扭转,而那三次的转移则是深透的、抛弃旧小编的!在Swift二.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)

在Swift3.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,那个主意希望在
Swift 三.0 中依然沿用旧有的“无第3参数名”的条条框框。在Swift 二.二 中:

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

概况不须求的词

当斯威夫特在20壹伍年十月被开源的时候,斩新的API引导宗旨包涵了八个十一分的词:“忽略
不须要 词语”,它引进了Swift 三.0
中另3个宏伟的更换,因为在格局名中那1个根本未曾要求出现的用语将被移去。让大家看上边包车型大巴这几个swift
二.第22中学的代码:

letblue = UIColor.blueColor()

letmin = numbers.minElement()

attributedString.appendAttributedString(anotherString)

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

UIDevice.currentDevice()

能来看代码中的难点啊?当大家采取UIColor的时候,blue当然是2个颜料,所以使用blueColor是多余的。当咱们加多2特性情字符串到另多个的时候,那多个东东一定都以字符串,而不可能另贰个是“大象”对啊!所以,同样的代码在Swift三.0中正是:

letblue = UIColor.blue()

letmin = numbers.min()

attributedString.append(anotherString)

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

UIDevice.current()

正如你见到的,那个改动让艺术名称更加短了。
那种退换在字符串的操作上效果显明,相比较上面的代码,你会发觉斯维夫特二.贰和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()了。

还有三个Swift 三.0的格局是上面那样:
dismiss(animated:true, completion:nil)

你大概会想,大家要dismiss什么啊?Swift三.0是既要加多第2参数的竹签,又要删减不须求的词,所以地点的代码实际是Swift二.第22中学的

dismissViewControllerAnimated(true, completion:nil)

具有一样效果的还有prepareForSegue方法,在斯维夫特 叁.0 中它成为了如此:

overridefuncprepare(forsegue:UIStoryboardSegue, sender:AnyObject?)

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

即便与语法未有怎么关联,可是大家对此类、结构、属性和枚举,始终根据着一个预约:类、结交涉枚举使用驼峰大写前缀,属性和参数名称使用驼峰小写前缀。那个约定也有两样,使用NSU福特ExplorerLRequest(UCR-VL:
someUENVISIONL) 创造NSUTucsonLRequest对象的时候,参数正是大写U哈弗L。Swift三重写了该措施为NSULacrosseLRequest(url: someUQashqaiL)
,也意味大家将会使用webView.request?.url?.absoluteString情势来读取web
view的UHavalL。

再有局地是在质量部分,比方说CGColor或CIColor。是的,未来它将会化为cgColor和ciColor。

letred = UIColor.red().cgColor

这种变化真的升高了编码的一致性:全数的习性和参数应该都以以小写起来,未有两样!

还要,枚举也在发生着退换,从驼峰大写前缀改为驼峰小写前缀。那代表:枚举是2个数据类型,但是枚举值更如同属性。然则,那意味苹果的枚举未来都以小写了。

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

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

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

Swift 引入 C 函数

Swift三引进C函数的性质。比如,全体以CGContext开首的函数未来都被映射为CGContext对象上的习性方法,那样大家就能够不再选用令我们那三个愁肠的CGContextSetFillColorWithColor()函数了。

swift 二.2中的代码:

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

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

瞩目:不管是Swift 贰.二仍旧斯维夫特 3.0
UIGraphicsGetCurrentContext()重临的是可选CGContext,所以在Swift三.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()

各种Swift三的改造章程都加多了d,代表这一个值正被重回。还有便是在数组排序的状态下。swift
2.2 使用 sort()再次来到二个排序还的数组,而
sortInPlace()则完成内部排序。在Swift 3.0中
sort()造成了sorted(),sortInPlace()产生了sort()。那也就表示那Swift二.第22中学sort()会回来数组,而在斯威夫特 三.0中一直内部排序。



1、深透移除在 斯维夫特 2.二 就曾经弃用的天性

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

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

这几个特点在我们选择 Xcode 柒.叁 的时候就早已有报告警察方提醒,在 斯维夫特 叁中已将其通透到底移出。

这几个特征在大家运用 Xcode 柒.3 的时候就曾经有报警提醒,在 斯维夫特 三中已将其根本移出。

那一个特色在大家接纳 Xcode 7.三 的时候就曾经有报警提示,在 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循环

二、打消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)
}

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

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

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

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

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

在 斯威夫特 函数中,参数私下认可是常量。过去能够在参数前加关键字 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 3 不再允许开垦者那样来将参数标识为变量了。

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

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

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

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

的局地分歧,斯维夫特三新特征汇总。过去借使三个函数有多个参数,调用的时候第一个参数无需带标签,而从第2个参数早先,必供给带标签。

过去借使1个函数有多少个参数,调用的时候第三个参数无需带标签,而从第3个参数初步,必须要带标签。

千古如若1个函数有三个参数,调用的时候第三个参数无需带标签,而从第叁个参数开头,必须求带标签。

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个参数前边加上一个下划线。

那个变化只怕会导致大家的品类代码要拓展比较大的转移,毕竟涉及的地点重重。所以苹果又提交了一种不用给第壹个参数带标签的消除方案。即在第三个参数前面加上3个下划线。
(可是那一个只是利于大家代码从 Swift2 迁移到 Swift3的二个折中方案,能够的话依旧提议将全体的参数都带上标签。)

本条变化大概会导致大家的等级次序代码要实行非常的大的转移,终归涉及的地方重重。所以苹果又提交了一种不用给第二个参数带标签的缓和方案。即在首先个参数前边加上1个下划线。
(然而那些只是造福大家代码从 斯维夫特二 迁移到 Swift三的三个折中方案,能够的话照旧提议将具有的参数都带上标签。)

(不过这一个只是有利于大家代码从 斯维夫特二 迁移到 斯威夫特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

}

五、函数注解和函数调用都供给括号来回顾参数

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

五、函数评释和函数调用都急需括号来回顾参数

大家得以应用函数类型作为参数
,对于三个参数是函数、重临值也是函数的函数。原来我们或者会这么写:

咱俩得以选择函数类型作为参数
,对于2个参数是函数、再次回到值也是函数的函数。原来小编们或者会那样写:

大家得以行使函数类型作为参数
,对于七个参数是函数、重临值也是函数的函数。原来作者们大概会那样写:

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

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

当那样不行麻烦阅读,极难看出参数在何地截止,再次来到值又从何地早先。在 Swift三 中成为那样定义这一个函数:

当那样尤其麻烦阅读,极不赏心悦目出参数在哪里停止,重回值又从哪儿开首。在 斯维夫特三 中成为那样定义那个函数:

当那样拾1分麻烦阅读,非常难看出参数在何地停止,再次来到值又从哪个地方开端。在 Swift③ 中成为那样定义这几个函数:

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

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

6、Selector 不再允许使用 String

六、Selector 不再允许行使 String

陆、Selector 不再允许使用 String

假若我们给按键增加3个点击事件响应,点击后实行 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
写的是字符串。假如字符串拼写错了,这程序会在运作时因找不到有关措施而夭亡。所以
Swift 三 将那种写法撤销,改成
#selecor()。那样就将允许编写翻译器提前检查格局名的拼写难点,而不用再等到运转时才发掘题目。

但鉴于按键的 selector
写的是字符串。若是字符串拼写错了,那程序会在运作时因找不到相关方法而夭折。所以
斯威夫特 叁 将那种写法打消,改成
#selecor()。那样就将同意编译器提前检查方式名的拼写难点,而不用再等到运转时才开掘标题。

但鉴于按键的 selector
写的是字符串。假若字符串拼写错了,这程序会在运转时因找不到相关方法而夭亡。所以
斯维夫特 三 将那种写法取消,改成
#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)

2、斯维夫特 三 的新特点

贰、斯威夫特 三 的新特色

二、Swift 3 的新性情

1、内联种类函数sequence

一、内联系列函数sequence

一、内联类别函数sequence

Swift 三 新扩张了四个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们能够回去二个十分类别。上边是二个差不离的选择样例,更详细的牵线能够自己的另一篇小说:斯维夫特

斯威夫特 3 新增添了三个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们得以回到三个分外种类。下边是三个粗略的使用样例,更详细的介绍能够自己的另1篇小说:Swift

**斯威夫特 三 新扩张了五个全局函数:sequence(first: next:) 和 sequence(state:
next:)。使用它们得以回到八个格外体系。上面是二个简便的使用样例,更详细的牵线能够本身的另一篇小说:斯维夫特

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

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

  • 内联连串函数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介绍(附样例)**

二、 key-path不再只可以动用String

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

// 从某四个树节点一贯进步遍历到根节点

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.

}

其一是用在键值编码(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
相关内容可以参见作者原先写的那篇小说:Swift –
反射(Reflection)的介绍与利用样例(附KVC介绍)

但提出接纳新扩充的 #keyPath()
写法,那样可避防止我们因为拼写错误而吸引难点。

但提出利用新增添的 #keyPath()
写法,那样能够制止我们因为拼写错误而吸引难点。

小编们依然得以一连使用 String 类型的 key-帕特h:

//使用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  //年龄

}

//创设3个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)

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

在 斯威夫特 三 中,将移除 NS 前缀,就改成了:

在 Swift 三 中,将移除 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

在 斯维夫特 三 中,π 提供了 Float,Double 与 CGFloat
三种样式(Float.pi、Double.pi、CGFloat.pi),所以求周长还足以那样写:

在 Swift 三 中,π 提供了 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,小编原先写过一篇相关小说:Swift – 十二线程达成格局(3) – Grand
Central Dispatch(GCD)
千古写法选拔 C
语言的风骨,初学者也许会一点都不大适应。比如成立3个简短的异步线程:

有关 GCD,作者原来写过1篇相关文章:Swift – 二十八线程完成格局(叁) – Grand
Central Dispatch(GCD)
千古写法采纳 C
语言的作风,初学者或然会一点都不大适应。举例创立叁个简短的异步线程:

至于 GCD,小编原先写过1篇相关小说:斯维夫特 – 二十多线程实现格局(叁) – 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
语言的风骨,初学者或然会非常小适应。举例创造1个简短的异步线程:

Swift 三 打消了那种冗余的写法,而选择了更进一步面向对象的点子:

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 3 撤销了那种冗余的写法,而利用了更进一步面向对象的方法:

陆、Core Graphics的写法也特别面向对象化

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

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

queue.async {

print(“Swift 3 queue”)

}

Core Graphics 是3个杰出壮大的绘图框架,不过和 GCD 同样,它原先的 API
也是 C 语言风格的。
比如大家要创设三个 view,其内部背景使用 Core Graphics
举行绘图(普鲁士蓝边框,蛋黄背景)。过去大家这么写:

Core Graphics 是三个一定强劲的绘图框架,但是和 GCD 同样,它原本的 API
也是 C 语言风格的。
举例我们要开创3个 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 是二个格外强大的绘图框架,不过和 GCD 同样,它原先的 API
也是 C 语言风格的。

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

在 Swift 叁中革新了写法,只要对目前画布上下文解包,之后的全数绘制操作就都基于解包对象。

比如大家要开创2个 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)

柒、新扩大的访问调节关键字:fileprivate、open

柒、新扩充的访问调节关键字:fileprivate、open

在 Swift 三中改正了写法,只要对现阶段画布上下文解包,之后的具有绘制操作就都依据解包对象。

在 Swift 三 中在原始的 3 个访问调控关键字 private、public、internal
外。又增添了一个新注重字 fileprivate、open。它们得以当作是对原来 private
和 public 的尤其划分。具体接纳方式和介绍能够看本身写的另1篇文章:斯维夫特

在 Swift 三 中在原始的 三 个访问调节关键字 private、public、internal
外。又增添了二个新重点字 fileprivate、open。它们能够看成是对原先 private
和 public 的愈益细分。具体选用方法和介绍能够看自身写的另1篇小说:Swift

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)

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

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

三、一些语法的退换

三、一些语法的更动

在 Swift 叁 中在原来的 三 个访问调控关键字 private、public、internal
外。又增多了二个新重视字 fileprivate、open。它们得以当作是对原本 private
和 public 的愈发划分。具体行使格局和介绍可以看我写的另1篇作品:Swift

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

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

  • 斯维夫特三新扩张的八个访问调控关键字介绍(fileprivate、open)

过去数组排序的五个方式:sortInPlace() 和 sort(),现在分别更名成 sort()
和 sorted()
sort() 是直接对目的数组进行排序。sorted()
是回来3个排序后的数组,原数组不变。

千古数组排序的几个方法:sortInPlace() 和 sort(),将来各自更名成 sort()
和 sorted()
sort() 是直接对目的数组举行排序。sorted()
是回到1个排序后的数组,原数组不变。

3、一些语法的修改

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]

一、数组排序: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中多余的单词

4、移除了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、枚举成员成为小写字母初步

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

Swift 叁将枚举成员当做属性来看,所以未来利用小写字母开首而不是原先的大写字母。

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

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

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

XCPlaygroundPage.currentPage 改为 PlaygroundPage.current

4858.com,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

5、枚举成员成为小写字母初步

在 Swift 3中,倘若3个方法有重回值。而调用的时候从不抽取该办法的重回值,Xcode
会报出警告,告诉你那可能会设有潜在难题。

在 斯维夫特 3中,如若贰个办法有重回值。而调用的时候未有接收该方法的重临值,Xcode
会报出警告,告诉您那也许会存在潜在难点。

斯维夫特 3将枚举成员当做属性来看,所以现在选择小写字母开始而不是以前的大写字母。

4858.com 2

4858.com 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()
    }
}

在 斯维夫特 三中,要是五个艺术有再次来到值。而调用的时候从不收到该办法的再次回到值,Xcode
会报出警告,告诉你这只怕会存在潜在难点。

初稿出自:航歌网

原稿出自:航歌网

4858.com 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()

}

}

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有