Swift3.0 - 真的很簡單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(shù)(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標(biāo)識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態(tài)調(diào)用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
介紹
- if...else
if true{
// code
}else{
// code
}
let (x,y) = (1,2)
if x = y{ // 這是一個錯誤的用法
}
提示:
判斷的條件必須為 true 或者false 不能是1,2 或者存在的對象,不然系會編譯錯誤,這點和OC 是有區(qū)別的
- 三目運算符(?)
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
- ?? 的使用
先看下面的例子
let a:Int! = 3
let b = 4
// 如果a不為nil則對a進行解包,賦值將b的值付給c
let c = a != nil ? a! : b
我們使用?? 可以很方便實現(xiàn)上面的功能
let c = a ?? b // 如果a為nil則使用b的值替換a的值,如果a不為nil,則對a解包然后將值付給b
我們再看一個例子
let a:Int??? = 3
let b = 4
let c = a ?? b
print(a)
print(c)
運行結(jié)果:
Optional(Optional(Optional(3)))
Optional(Optional(3))
分析:
對a進行一次解包,得到的值不為nil,所以把解包后的值付給c
我們再看一個例子
let a:Int??? = nil
let b = 4
let c = a ?? b
print(a)
print(c)
可能有些人已經(jīng)猜到答案了
nil
4
但我告訴你答案不是這樣的,先來分析一下
首先a,有三個包Optional(Optional(Optional(nil))),當(dāng)我們解掉第一次包后,發(fā)現(xiàn)值為nil,此時,我們需要將b的值替換給a,Optional(Optional(4))
所以我們的最終顯示結(jié)果為:
nil
Optional(Optional(4))
- 范圍操作符 ... ..<
for index in 1..<5 {
print("\\(index) times 5 is \\(index * 5)")
}
- 多種邏輯操作符的結(jié)合
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
- for ... in
// 遍歷數(shù)組
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
print("Hello, \\(name)!")
}
// 遍歷字典
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("\\(animalName)s have \\(legCount) legs")
}
- while
var i = 100
while i >0{
i-= 1
}
- repeat ... while
var i = 10
repeat {
i -= 1
print(i)
}while i >= 0
- switch
需求1: 根據(jù)輸入的成績判斷學(xué)生是否及格
a. 間隔法
enum TestResult{
case Pass
case NoPass
}
b. 條件判斷法
func inputStudentScore(score:Float) -> TestResult{
switch score {
case 0..<59:
return .NoPass
default:
return .Pass
}
}
需求二: 輸入一個頂點 判斷是否在X軸上,或者Y軸上,或者既不在x軸,也不再Y軸上
c.元組法
func inputPoint(point : (Float,Float)) {
switch point {
case (_,0):
print("在x軸上")
case (0,_):
print("在y軸上")
case (_,_):
print("既不在x軸,也不在y軸上")
}
}
d.值綁定法
func inputPoint(point : (Float,Float)) {
switch point {
case (let x ,0):
print("在x軸上\\(x)")
case (0,let y):
print("在y軸上\\(y)")
case let (x,y):
print("既不在x軸,也不在y軸上\\(x),\\(y)")
}
}
需求: 判斷頂點是否在X,Y軸上
- 混合法
func inputPoint(point : (Float,Float)) {
switch point {
case (let x ,0),(0,let x): // 注意必須每種模式類型相同
print("在x軸或者y軸上\\(x)")
case let (x,y):
print("既不在x軸,也不在y軸上\\(x),\\(y)")
}
}
- 控制轉(zhuǎn)移聲明
a.continue
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
switch character {
case "a", "e", "i", "o", "u", " ":
continue
default:
puzzleOutput.append(character)
}
}
b.break
let numberSymbol: Character = "三" // Chinese symbol for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
case "1", "?", "一", "?":
possibleIntegerValue = 1
case "2", "?", "二", "?":
possibleIntegerValue = 2
case "3", "?", "三", "?":
possibleIntegerValue = 3
case "4", "?", "四", "?":
possibleIntegerValue = 4
default:
break
}
c.fallthrough
let integerToDescribe = 5
var description = "The number \\(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough // 打穿繼續(xù)向下執(zhí)行
default:
description += " an integer."
}
print(description)
運行結(jié)果:
The number 5 is a prime number, and also an integer.
d.return
需求:在一個數(shù)組中查找是否存在一個整數(shù),如果找到返回true 沒有返回false
let nums = [1,2,3,6,7,9,10]
func findNum(num:Int)-> Bool{
for number in nums{
if num == number{
return true
}
}
return false
}
e.throw
f.標(biāo)簽用法
需求: 讓一個a數(shù)字從0開始,每次增加一個隨機數(shù),直到數(shù)字a=1000 結(jié)束循環(huán),如果大于1000 則繼續(xù)從0 開始循環(huán)增加
var start:Int = 0
var final = 1000
whileLabel: while start != final {
start += Int(arc4random_uniform(100)) // 隨機增加一個數(shù)字
switch start {
case final: // 如果== 最終值結(jié)束循環(huán)
break whileLabel
case let x where x > final: //如果值大于1000 則初始化為0 繼續(xù)開始循環(huán)
start = 0
continue whileLabel
default:
break
= }
print(start)
}
- guard ...else
需求: 輸入學(xué)生姓名,查詢學(xué)生成績
a.原始寫法(if):
let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{ // 先檢測姓名是否為空
if let n = name {
if let score = studentScoreDic[n] {// 檢測學(xué)生是否存在
return score
}
}
return 0.0
}
b.guard ... else
let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
// 檢測姓名是否為空
guard let n = name else {
return 0.0
}
// 檢測學(xué)生是否存在
guard let score = studentScoreDic[n] else{
return 0.0
}
return score
}
c.使用?? 簡化寫法
let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
guard let n = name else {
return 0.0
}
return studentScoreDic[n] ?? 0.0
}
d. 多條件簡化法- guard 版
let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
guard let n = name ,let score = studentScoreDic[n] else {
return 0.0
}
return score
}
e.多條件簡化法- if 版
let studentScoreDic = ["小明":30.0,"小摩納哥":99.0]
func getScoreByName(name:String!)->Double{
if let n = name ,let score = studentScoreDic[n]{
return score
}
return 0.0
}
中級
- 多條件判斷
需求:
輸入兩個數(shù)字,如果兩個數(shù)字都小于100 并且第一個數(shù)字小于第二數(shù)字,按照順序輸出他們
方式1:
func inputFirstNum(num1:String,num2:String){
if let n1 = Int(num1){
if let n2 = Int(num2){
if n1 < n2 && n2 < 100 {
print("\\(n1)<\\(n2)<\\(100)")
}
}
}
}
方式2:
func inputFirstNum(num1:String,num2:String){
if let n1 = Int(num1),let n2 = Int(num2),n1 < n2,n2 < 100{
print("\\(n1)<\\(n2)<\\(100)")
}
}
- 元組判斷
if (1, "zebra") < (2, "apple") { // 先判斷第一個,在判斷第二個
// 結(jié)果為true
}
你必須注意的幾點
1.轉(zhuǎn)換出現(xiàn)可選值
if let n = Int(3.3){
} // 編譯報錯
if let n = Int("3.3"){
print(n)
} // 編譯通過
運行結(jié)果:
1.第一個if報錯
2.第二個print(n) 不執(zhí)行
問題:為什么第一個if會報錯乞娄?
答:Swift編譯器要求我們右邊必須為可選值類型Int(3.3) 產(chǎn)生的結(jié)果不是可選值,我在swift3.0-數(shù)據(jù)類型 中講過數(shù)據(jù)類型之間轉(zhuǎn)換不可能出現(xiàn)可選值,但是字符串轉(zhuǎn)數(shù)字結(jié)果為可選值,所以第二個if是正確的
我們修改上面的代碼
if let n:Int = Int(3.3) {
print(n)
} // 編譯警告
if let n :Int = Int("3.3"){
print(n)
} // 編譯通過
if let n:Int? = Int(3.3) {
print(n)
} // 編譯警告-說總是成功的
if let n :Int? = Int("3.3"){
print(n)
} // 編譯通過 - 說總是成功的
if let n:Int! = Int(3.3){
print(n)
}// 編譯報錯 - 非可選值不能解包
if let n :Int! = Int("3.3"){
print(n)
} // 編譯報錯-解包的時機不對
2.注意可選值的判斷邏輯
let name1:String! = "酷走天涯" // 定義一個需要解封的可選值
let name2:String? = "酷走天涯" // 定義可選值
let name3:String = "酷走天涯" // 定義非可選值
if name1 != nil {
} // 編譯成功
if let myName = name1{
} // 編譯錯誤
if name2 != nil {
} // 編譯成功
if let myName = name2{
} // 編譯錯誤
if name3 != nil {
} // 編譯警告 - 總是成功
if let myName = name3{
} // 編譯錯誤 - name3 不是可選值
結(jié)論:
只有可選值或者解包過的可選值,判斷是否為nil是有意義的,非可選值不可能為nil,判斷總是成功的,判斷沒有意義沦辙。 對非可選值使用解包判斷方式總是失敗的钮惠。