Swift3.0 Guided Tour (1) -控制流与函数闭包

半年多没更新了。。。更多的是在印象笔记里写的太乱了。。十一抽个时间整理一下。。。cool

下面正文


 

最近开始学习Swift了,正好Swift也升级到3.0了

目前通过2个方面在并行的学习Swift,这两个都有在我的GitHub上更新进度( 算法,项目),有兴趣的同学可以一起哈

  • 语言基础方向 -> 主要通过看Apple的Swifit3.0官方文档 同时最近也在看算法,准备用Swift都过一遍之前的算法题目

  • app构建项目方向 -> 看的是Stanford上的2016年春的Swift教程,建议在iPhone的iTunes U 上阅读 ,上面有slides和assignment,并且观看有英文字幕。

 

这篇是苹果官方的Swift3.0 Guide Tour ,算是脱水翻译版吧,代码为主,我觉得代码更直观一点

 

#1.流程控制

if 基本操作和普通的一样 少了括号


var optionalString: String? = "Hello" print(optionalString == nil) print(optionalString) var optionalName: String? var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }

for   ..< 操作符

迭代循环的对象可以infer出类型


let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } }

取消了for的三目运算符 而且类型也可以infer


这个相当于 i = 0 ; i < 4 ; i++ ,如果需要包含的话就是 0 ...4 var total = 0 for i in 0.. total += i } print(total)

switch

while / Repeat

类似于while 和 do while


var n = 2 while n < 100 { n = n * 2 } print(n) var m = 2 repeat { m = m * 2 } while m < 100 print(m) ``` #2. Functions和闭包的特点   可以不带参数名调用 ``` func greet(_ person: String, on day: String) -&gt; String { return "Hello \(person), today is \(day)." } greet("John", on:"Wednesday")

可以返回多个参数值 ,取值可以通过参数名和参数位置取到,避免了自定义类或者struct


func calculateStatistics(scores: [Int]) -&gt; (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score &gt; max { max = score } else if score &lt; min { min = score } sum += score } return (min, max, sum) }   let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9]) print(statistics.sum) print(statistics.2) print(statistics.min) ``` 不定参数 ``` func sumOf(numbers: Int...) -&gt; Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf() sumOf(numbers: 42, 597, 12) sumOf(numbers: 54,12,89,67)

多参数返回


func info(numbers: Int...)-&gt;( avarg:Int , sum:Int){ var sum = 0 for num in numbers { sum += num } return (avarg: sum / numbers.count , sum: sum) } info(numbers: 54,12,89,67)

函数作为返回值


func addMore() -&gt; ((Int)-&gt;Int){ func addOne(number: Int) -&gt; Int{ return 1 + number } return addOne } var addMoreTest = addMore() addMoreTest(6)

函数作为参数

PS:这里如果函数作为参数,并且改函数是空返回 的 写法应该是这样 :(Int) -&gt; ()  代表空返回 ,这里查了半天没查到资料,最后在错误提示时发现该这么写


func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { for item in list { if condition(item) { return true } } return false } func lessThanTen(number: Int) -> Bool { return number < 10 } var numbers = [20, 19, 7, 12] hasAnyMatches(list: numbers, condition: lessThanTen) ``` Functions函数其实是一种特殊的闭包(Blocks of Code) 代码被({})包围就代表是闭包 下面是一个对array的元素转变的例子 ``` numbers.map({ (number: Int) -&gt; Int in let result = 3 * number return result })

闭包的参数类型可以简写 可以省略 因为编译器会知道你的参数类型


let mappedNumbers = numbers.map({ number in 3 * number }) print(mappedNumbers)

进一步可以省略到参数的定义 ,因为有几个默认输入参数 $0 $1 $2


let mapNumbers = numbers.map({  3 * $0 }) print(mapNumbers)

 

下周继续,么么哒~

Posted in iOS

发表评论

电子邮件地址不会被公开。