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

819 阅读2分钟
原文链接: danny-lau.com

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


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

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

  • 语言基础方向 -> 主要通过看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) -> String {

return "Hello \(person), today is \(day)."

}

greet("John", on:"Wednesday")

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

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {

var min = scores[0]

var max = scores[0]

var sum = 0

for score in scores {

if score > max {

max = score

} else if score < 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...) -> 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...)->( 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() -> ((Int)->Int){

func addOne(number: Int) -> Int{

return 1 + number

}

return addOne

}

var addMoreTest = addMore()

addMoreTest(6)

函数作为参数

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

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

下周继续,么么哒~