Swift3入门教程之一基础部分

我的博客地址: fengqiangboy.com

文档更新说明:

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

0、前言

随着iOS10的发布,相信大部分公司都会把app的适配最低版本直接拉倒iOS8,毕竟维护和开发成本都会省掉不少。
在iOS8上面,有一个重要的特性,就是可以使用swift了,而swift也已经发布了3.0版本,已经相当稳定了,所以,这个时候开始使用swift是一个明智的选择。
这篇文章适合于有一定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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容