Swift3入门教程之一基础部分

文档更新说明:

•   2016年10月07日 v1.0 初稿

0、前言

随着iOS10的发布,相信大部分公司都会把app的适配最低版本直接拉倒iOS8,毕竟维护和开发成本都会省掉不少。
在iOS8上面,有一个重要的特性,就是可以使用swift了,而swift也已经发布了3.0版本,已经相当稳定了,所以,这个时候开始使用swift是一个明智的选择。
这篇文章适合于有一定iOS开发经验的看,如果是完全没有iOS开发经验的,可能本文并不适合你。

1、常量

  • 常量是不需要被改变的,用let关键字声明
  • 后面跟着常量的名称,冒号后面表示产量的类型,等号后面表示常量的值。
  • 在实际应用当中,一般省略冒号后面的类型声明,swift会自动根据我们的赋值来推断该常量的类型。
let language: String = "Swift"
let introduced: Int = 2014
let isAwesome: Bool = true

2、变量

  • 可以被修改的值,我们称为变量
  • 在swift中,变量使用var声明,格式和常量的声明一致。
let language = "Swift"
let introduced = 2014
let isAwesome = true
var version = 1
version = 3
isAwesome = false  //这行报错

运行上面的代码,可以发现,编译器在最后一行报了错误,因为我们试图修改了一个常量的值。

3、字符串拼接

  • swift中直接使用“+”来拼接字符串即可
let conference = "WWDC"
let message = "Hello, " + conference + "!"
// "Hello, WWDC!"

4、字符串插值

  • 字符串的拼接不仅仅局限于字符串之间,swift也可以直接把值插入字符串中。
  • 把值连接到字符串中,只需要把值放入\()中,
  • 括号内还可以是一个表达式。例如:\(year + 1)
let conference = "WWDC"
let message = "Hello, \(conference)!"
// "Hello, WWDC!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year)!"
// "Hello, WWDC 2016!"
let conference = "WWDC"
let year = 2016
let message = "Hello, \(conference) \(year + 1)!"
// "Hello, WWDC 2017!"

5、集合:数组和字典

  • swift中,数组和字典的声明方式很相似,
  • 为了安全,我们可以在名字后面声明类型。
let names: [String] = ["Lily", "Santiago", "Justyn", "Aadya"]
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
  • 当然,swift也可以自动推测数组和字典的类型,因此,在实际应用中,可以省略类型
let names = ["Lily", "Santiago", "Justyn", "Aadya"]
// an array of String values
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// a dictionary with String keys and Int values

6、循环

6.1 While 和 Repeat-While 循环

  • while循环,先检查条件是否成立,再执行循环体
  • repeat循环,先执行循环体,再判断条件是否成立
while !endOfFile {
   readLine()
}


repeat {
   performTask()
} while tasksRemaining > 0

6.2 For-In循环

6.2.1 遍历字符串

let dogString = "Dog?!🐶"
for character in dogString.characters {
   print(character)
}


/*
输出结果:
D
o
g
?
!
🐶
*/

6.2.2 遍历一个闭合区间

使用1...5表示[1,5]的闭合区间

for number in 1...5 {
   print("\(number) times 4 is \(number * 4)")
}

/*
输出结果:
1 times 4 is 4
2 times 4 is 8
3 times 4 is 12
4 times 4 is 16
5 times 4 is 20
*/

6.2.3 遍历半开半闭合区间

  • 使用1..<5表示[1,5)的半开半闭区间
  • 没有这样的写法1<..5
let results = [7, 52, 9, 33, 6, 12, 86, 4, 22, 18, 3]
let maxResultCount = 5
for index in 0..<maxResultCount {
   print("Result \(index) is \(results[index])")
}

/*
输出结果:
Result 0 is 7
Result 1 is 52
Result 2 is 9
Result 3 is 33
Result 4 is 6
*/

6.2.4 遍历数组

  • 遍历的临时变量不需要用let声明,默认以let声明,如果需要,可以直接换成var声明,如:for var name in [...]
  • 如果遍历的临时变量不需要被使用到,可以用“_”来代替
for name in ["Lily", "Santiago", "Justyn", "Aadya"] {
   print("Hello, \(name)!")
}

/*
输出结果:
Hello, Lily!
Hello, Santiago!
Hello, Justyn!
Hello, Aadya!
*/

6.2.5 遍历字典

  • 使用元组(key, value)来表示字典的键和值
  • 元组是可以绑定多个值的一个类型,用括号表示,值之间用逗号分割开来
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
for (name, age) in ages {
   print("\(name) is \(age) years old")
}

/*
输出结果:
Mohsen is 17 years old
Amy is 40 years old
Graham is 5 years old
*/

7、可变集合

7.1、可变数组

使用var声明的数组就是可变数组,可以通过几种方式修改可变数组中的值。

  • 使用.append方法,给数组添加一个元素
  • 使用下标packingList[2]的方式,修改数组指定位置的元素(小心越界)
  • 使用.append(contentsOf:[])给数组增加一系列的值
  • 使用下标packingList[3...5]修改数组指定位置范围的值,使用这个方法的时候,如果等号右边的元素数量大于左边的范围,会扩充原数组的长度,反之会减少
var packingList = ["Socks", "Shoes"]
print(packingList[0])
packingList.append("Trousers")
packingList[2] = "Jeans"
packingList.append(contentsOf: ["Shorts", "Sandals", "Sunblock"])
packingList[3...5] = ["Hoodie", "Scarf"]


/*
输出结果:

["Socks", "Shoes", "Jeans", "Hoodie", "Scarf"]

*/

7.2、可变字典

  • 可变字典的修改和增加方式都可以用下标来直接操作
var ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
ages["Justyn"] = 67     // Adds a new value for "Justyn"
ages["Justyn"] = 68     // Changes the value for "Justyn"

/*
输出结果:

["Mohsen": 17, "Amy": 40, "Graham": 5, "Justyn": 68]

*/

8、Optional

8.1、从字典中检索值

  • 从字典中检索值需要考虑一个问题,就是字典中可能并没有存储我们需要检索的值,比如,在下面的字典中,我们如果去获取Devon、Daryl、Daniel的值,这时候会获得一个空值nil
  • 在获取之后,我们需要判断一下值是否为nil
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
// Devon?
// Daryl?
// Daniel?

8.2、加上nil判断

  • 对于可能返回nil的值,我们可以使用swift的Optional特性,在类型后面加一个?,比如:Int?,这就表示这个值可能为nil
  • 从字典获取指定的值,加上判断之后就变成了下面的代码
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
let possibleAge: Int? = ages["Daryl"]
if possibleAge == nil {
   print("Age not found.")
}


/*
输出结果:

Age not found.

*/

8.3、nil值判断优化 If-Let

  • 上面的判断看起来没问题,但是在实际应用中,我们可能只关心值不为nil的情况,所以,上面的写法会有些臃肿
  • swift中提供了If-Let语句,只有在值不为nil的时候才执行条件体
let ages = ["Mohsen": 17, "Amy": 40, "Graham": 5]
if let age = ages["Amy"] {
   print("An age of \(age) was found.")
}


/*
输出结果:

An age of 40 was found.

*/

9、 判断结构

9.1、if判断结构

  • 和其它语言相似,只是swift中,条件语句不需要小括号括号括起来。
  • 每个条件的执行语句需要用大括号括起来
let age = 32
if age == 1 {
   print("Happy first birthday!")
} else if age == 40 {
   print("Happy 40th birthday!")
} else {
   print("Happy plain old boring birthday.")
}

9.2、Switch 判断结构

  • case可以直接匹配一个精确的值,包括字符串变量也可以直接匹配
  • case也可以匹配一个范围。如:case 13...19:
  • case中还可以加入更精确的条件匹配语句。如:case let decade where decade % 10 == 0:
  • 每个case语句不需要break来结束循环,会自动结束,如果需要执行下一个case的语句,需要加上fallthrough关键字
  • switch中需要匹配完整所有的情况,否则会报错
let age = 32
switch age {
case 1:
   print("Happy first birthday!")
case 13...19:
   print("Happy birthday, teenager!")
case let decade where decade % 10 == 0:
   print("Happy significant \(decade)th birthday!")
default:
   print("Happy plain old boring birthday.")
}
  • switch可以直接匹配元组,以达到匹配同时判断多个值的目的,如下:
  • _” 表示该位置匹配任何值
let userName = "admin"
let passwordIsValid = true
switch (userName, passwordIsValid) {
case ("admin", true):
   print("Welcome back, administrator!")
case ("guest", _):
   print("Guests are not allowed in this restricted area.")
case (_, let isValid):
   print(isValid ? "Welcome to the restricted area!" : "ACCESS DENIED.")
}


/*
输出结果:

Welcome back, administrator!

*/

相关文章

1、Swift3入门教程之二---函数

参考资料:

  1. Swift Standard Library Playground
  2. Swift.org
  3. The Swift Programming Language (Swift 3)
  4. Using Swift with Cocoa and Objective-C (Swift 3)
  5. WWDC2016:Session 404 Getting Started with Swift



本文已在版权印备案,如需转载请访问版权印。