前言: 作為一個水平一般彰檬,沒有追求的OC開發(fā)者氏淑,從swift1.0開始就買了幾本swift參考書言询,直到現(xiàn)在swift3.0+了還沒看完一本完整的swift參考書攒岛,沒有寫過一個完整的swif項目甚是慚愧酪术,其實期間也斷斷續(xù)續(xù)學了一陣子妆毕,沒有堅持住涝影,加之公司項目一直是以OC為主句旱,大量時間浪費在寫業(yè)務代碼,老是抱著swift不成熟鬼廓,API還不穩(wěn)定等一等的井底之蛙心態(tài)肿仑,現(xiàn)在是時候反省下自己了,所謂知途迷返碎税,亡羊補牢尤慰,為時不晚。(從現(xiàn)在開始雷蹂,立刻伟端,馬上學習swif的必要性重要性可以參考下微博@沒故事的卓同學的文章: Swift 再等等?我的答案是:快上車http://www.reibang.com/p/2452cb269ae2
話不多說匪煌,先擼為敬责蝠,以下是記錄整理學習小碼哥Mr why 的swift課程筆記,以作為復習查看之用
一 . 初識swift
Playground是什么?
從Xcode6開始出現(xiàn)(Swift開始出現(xiàn)) 翻譯為:操場/游樂場萎庭,對于學習Swift基本語法非常方便霜医,所見即所得(快速查看結(jié)果),語法特性發(fā)生改變時,可以快速查看.
Swift最基本的語法變化:
- swift中如何導入框架驳规? 直接 import 框架名稱 即可
例如 import UIKit - 如何定義標識符支子?
定義標識符必須告知系統(tǒng) 該標識符是一個變量還是常量
格式: let/var 標識符的名稱 : 標識符的數(shù)據(jù)類型 = 值 - 語句結(jié)束有何變化?
一般情況下不需要寫; 如果一行中有多條語句;則需要以;分割 - 怎么打印內(nèi)容达舒?
print(a)
二. 常量&變量
變量的基本使用
let a :Int =40
//a=20// 錯誤寫法,當一個字段定義為常量時是不可以修改的
var b : Int = 60
一般習慣寫成 var b = 60 (swift中的類型推導)
變量的基本使用
let a :Int =40
//a=30// 錯誤寫法,當一個字段定義為常量時是不可以修改的
var b : Int = 60
一般習慣寫成 var b = 60 (swift中的類型推導)
三. swift中數(shù)據(jù)類型
swift類型的介紹
Swift中的數(shù)據(jù)類型也有:整型/浮點型/對象類型/結(jié)構體類型等等
先了解整型和浮點型
整型
有符號
Int8 : 有符號8位整型
Int16 : 有符號16位整型
Int32 : 有符號32位整型
Int64 : 有符號64位整型
Int : 和平臺相關(默認,相當于OC的NSInteger)
無符號
UInt8 : 無符號8位整型
UInt16 : 無符號16位整型
UInt32 : 無符號32位整型
UInt64 : 無符號64位整型
UInt : 和平臺相關(常用,相當于OC的NSUInteger)(默認)
浮點型
Float : 32位浮點型
Double : 64浮點型(默認)
// 定義一個Int類型的變量m,并且賦值為10
var m : Int = 10
// 定義一個Double類型的常量n,并且賦值為3.14
let n : Double = 3.14
swift中的類型推導
swift是強類型的語言
swift中任何一個標識符都有明確的類型
注意:
如果定義一個標識符時有直接進行賦值,那么標識符后面的類型可以省略. 因為swift有類型推導,會自動根據(jù)后面的賦值來決定前面的標識符的數(shù)據(jù)類型
可以通過option+鼠標左鍵來查看變量的數(shù)據(jù)類型
// 定義變量時沒有指定明確的類型,但是因為賦值給i一個20.20為整型.因此i為整型
var i = 20
// 錯誤寫法:如果之后賦值給i一個浮點型數(shù)值,則會報錯
// i = 30.5
// 正確寫法
var j = 3.33
j = 6.66
swift中基本運算
/
import UIKit
// 定義變量時沒有指定明確的類型,但是因為賦值給i一個20.20為整型.因此i為整型
var i=20
//i=30.5 // 錯誤寫法:如果之后賦值給i一個浮點型數(shù)值,則會報錯
// 正確寫法
var j=3.33
j=6.66
/
Swift中在進行基本運算時必須保證類型一致,否則會出錯
相同類型之間才可以進行運算
因為Swift中沒有隱式轉(zhuǎn)換
數(shù)據(jù)類型的轉(zhuǎn)化
Int類型轉(zhuǎn)成Double類型:Double(標識符)
Double類型轉(zhuǎn)成Int類型:Int(標識符)
*/
let a = 10
let b = 3.14
// 錯誤寫法
//let c = a + b
//let c = a * b
// 正確寫法
let c = Double(a)+b
let d = a + Int(b)
三.邏輯分支
(一). 分支的介紹
分支即if/switch/三目運算符等判斷語句
通過分支語句可以控制程序的執(zhí)行流程
(二). if分支語句
和OC中if語句有一定的區(qū)別
判斷句可以不加(),在Swift的判斷句中必須有明確的真假叹侄,不再有非0即真巩搏,必須有明確的Bool值,Bool有兩個取值:false/true
/
//1 swift 中if的寫法
//1> if后面的()可以省略
//2>判斷句不在有非0/nil即真趾代,判斷句中必須有明確的真假Bool值贯底,Bool值有兩個取值:false/tru
// 演練一:
let a = 10
// 錯誤寫法: 不再有非0即真 必須有明確的Bool值 false/true
//if a {
// print("a")
//}
// 正確寫法
if a > 9 {
print(a)
}
//2. swift 中else if的用法:用法和if的用法一致
let score = 92
if score < 0 || score>100 {
print("不合理的分數(shù)")
} else if score < 60 {
print("不及格")
} else if score < 80 {
print("及格")
} else if score < 90 {
print("良好")
} else if score <= 100 {
print("優(yōu)秀")
}
/
(三). 三目運算符
Swift 中的 三目 運算保持了和 OC 一致的風格
/
//3. 三目運算符
//取二者最大值
let x = 20
let y = 30
// if寫法
//var result = 0
//if m > n {
// result = m
//}else {
// result = n
//}
let result = x > y ? x :y
/
(四).guard的使用
guard是Swift2.0新增的語法
它與if語句非常類似,它設計的目的是提高程序的可讀性
guard語句必須帶有else語句,它的語法如下:
當條件表達式為true時候跳過else語句中的內(nèi)容禽捆,執(zhí)行語句組內(nèi)容
條件表達式為false時候執(zhí)行else語句中的內(nèi)容笙什,跳轉(zhuǎn)語句一般是return、break胚想、continue和throw
guard 條件表達式 else {
// 條換語句
break
}
語句組
/
//例子
var age = 18
func online(age : Int) -> Void {
guard age >= 18 else {
print("回家去找媽媽")
return
}
print("小伙子可以上網(wǎng)了")
}
online(age: age)
/
(五).switch分支
switch的介紹
Switch作為選擇結(jié)構中必不可少的語句也被加入到了Swift中
只要有過編程經(jīng)驗的人對Switch語句都不會感到陌生
但蘋果對Switch進行了大大的增強琐凭,使其擁有其他語言中沒有的特性
switch的簡單使用
基本用法和OC用法一致
不同之處:
switch后可以不跟()
case后可以不跟break(默認會有break)
/
//1. switch的基本用法
let sex = 0
switch sex {
case 0:
print("男")
case 1:
print("女")
default:
print("其他")
}
/
簡單使用補充1:
一個case判斷中,可以判斷多個值
多個值以,隔開
/
let sex1 = 0
switch sex1 {
case 0,1:
print("正常人")
default:
print("其他")
}
/
簡單使用補充2:
如果希望出現(xiàn)之前的case穿透,則可以使用關鍵字fallthrough
/
let sex2 = 0
switch sex2 {
case 0:
print("男")
fallthrough
case 1:
print("女")
default:
print("其他")
}
/
Switch支持多種數(shù)據(jù)類型
浮點型的switch判斷
/
let f = 3.14
switch f {
case 3.14:
print("π")
default:
print("not π")
}
/
支持字符串類型
字符串的使用后面會詳細講解
/
let m = 5
let n = 10
var results = 0
let operation = "+"
switch operation {
case "+" :
results = m + n
case "-" :
results = m - n
case "" :
results = m * n
case "/" :
results = m / n
default:
results = 0
print("非法操作符")
}
/*
switch支持區(qū)間判斷
什么是區(qū)間?
通常我們指的是數(shù)字區(qū)間:010,100200
swift中的區(qū)間常見有兩種
半開半閉區(qū)間:0..<10 表示:0~9,不包括10
閉區(qū)間:0...10 表示:0~10
*/
let scores = 88
switch score {
case 0..<60:
print("不及格")
case 60..<80:
print("及格")
case 80..<90:
print("良好")
case 90..<100:
print("優(yōu)秀")
default:
print("滿分")
}
四. 循環(huán)
循環(huán)的介紹
在開發(fā)中經(jīng)常會需要循環(huán),常見的循環(huán)有:for/while/do while.這里我們只介紹for/while,因為for/while最常見
//for循環(huán)的寫法
// OC寫法
//for (int i = 0;i< 10; i++){
// NSLog(@"%d", i);
//}
//swift寫法 for后面的()可以省
//最常規(guī)寫法
// 1.傳統(tǒng)寫法
//for var i = 0; i <10; i++ {
// print(i)
//}
// 2.區(qū)間for循環(huán) for循環(huán)的forin寫法
for i in 0..<10 {
print(i)
}
//3. 特殊寫法:如果在for循環(huán)中不需要用到下標i 可以使用 _ 來代替
for _ in 0..<10 {
print("hello")
}
//while和do while循環(huán)
//while循環(huán)
//1>.while的判斷句必須有正確的真假,沒有非0即真
//2>.while后面的()可以省略
var a=0
while a < 10 {
a ++
}
//do while循環(huán)
//使用repeat關鍵字來代替了do
let b = 0
repeat {
print(b)
b++
} while b < 20
五. 字符串
字符串的介紹
字符串在任何的開發(fā)中使用都是非常頻繁的浊服,OC和Swift中字符串的區(qū)別统屈,在OC中字符串類型時NSString,在Swift中字符串類型是String
OC中字符串@"",Swift中字符串""
使用 String 的原因:
String 是一個結(jié)構體,性能更高牙躺, NSString 是一個 OC 對象愁憔,性能略差, String 支持直接遍歷
Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換
//1. 字符串的定義
//定義不可變字符串
let str = "hello world"
for c in str.characters {
print(c)
}
//2.字符串的使用
//2.1獲取字符串的長度
//獲取字符集合,再獲取集合的count屬性
//定義可變字符串
let count = str.characters.count
var str0 = "hello world"
//2.2遍歷字符串
for c in str.characters{
print(c)
}
//3.字符串的拼接
//3.1兩個字符串之間的拼接
let str1 = "我是碼農(nóng)界"
let str2 = "古天樂"
let str3 = str1 + str2
print(str3)
//3.2字符串和其他標識符之間的拼接
let name = "mxp"
let age = 18
let height = 1.88
let info = "my name is (name), my age is (age), my height is (height)"
//3.3拼接字符串時孽拷,字符串的格式化 比如時間:03:04
let min = 2
let second = 18
let timeString = String(format:"%2d:%02d",arguments :[min,second])
print(timeString)
//4.字符串的截取
/*Swift中提供了特殊的截取方式
該方式非常麻煩
Index創(chuàng)建較為麻煩
簡單的方式是將String轉(zhuǎn)成NSString來使用
在標識符后加:as NSString即可
*/
let myStr = "www.520.it.com"
var subStr = (myStr as NSString).substring(from: 4)
subStr = (myStr as NSString).substring(to: 3)
subStr = (myStr as NSString).substring(with: NSRange(location:4,length:5))
//swift截取方式
// 4.1定義字符串
let str5 = "http://weibo.com/2187793237/profile?topnav=1&wvr=6"
// 4.2截取開始位置
let fromIndex = str5.startIndex
let header = str5.substring(from: fromIndex)
// 4.3 截取結(jié)束位置
//let toIndex = str5.endIndex.advancedBy(-3) //swift2.0寫法
let toIndex = str5.index(str5.endIndex, offsetBy: -3) //swift3.0寫法
// 4.4 截取中間的字符串
//var range = string.rangeOfString("520")//swift2.0寫法
let range = str5.range(of:"520")//swift3.0寫法
六. 數(shù)組
(一). 數(shù)組的介紹
數(shù)組(Array)是一串有序的由相同類型元素構成的集合
數(shù)組中的集合元素是有序的吨掌,可以重復出現(xiàn)
Swift中的數(shù)組
swift數(shù)組類型是Array,是一個泛型集合
(二). 數(shù)組的初始化/定義
數(shù)組分成:可變數(shù)組和不可變數(shù)組
使用let修飾的數(shù)組是不可變數(shù)組
使用var修飾的數(shù)組是可變數(shù)組
*/
// 定義一個可變數(shù)組,必須初始化才能使用
var arr : [String] = String
// 定義一個不可變數(shù)組
let arr0 : [NSObject] = ["Fsociety" as NSObject,28 as NSObject]
//在聲明一個Array類型的時候可以使用下列的語句之一
var stuArr1 : Array<String>
var stuArr2 : [String]
//聲明的數(shù)組需要進行初始化才能使用脓恕,數(shù)組類型往往是在聲明的同時進行初始化的
// 定義時直接初始化
var array = ["古天樂","吳彥祖","陳冠希"]
// 先定義,后初始化
var array0 : Array<String>
array0 = ["古天樂","吳彥祖","陳冠希"]
// (三). 對(可變)數(shù)組的基本操作
// 添加數(shù)據(jù)
array0.append("劉亦菲")
// 刪除元素
array0.removeLast()
// 修改元素
array0[1] = "艾薇兒"
// 取值
array0[0]
(四). 數(shù)組的遍歷
// 遍歷數(shù)組
for i in 0..<array.count {
print(array[i])
}
// forin方式
for item in array{
print(item)
}
// 設置遍歷的區(qū)間
for item in array[0..<2] {
print(item)
}
// 遍歷數(shù)組的同時獲取下標值
let names = ["古天樂","吳彥祖","陳冠希"]
for (index, name) in names.enumerated() {
print(index)
print(name)
}
(五). 數(shù)組的合并
// 注意:只有相同類型的數(shù)組才能合并
var array01 = ["古天樂","吳彥祖","陳冠希"]
var array02 = ["艾薇兒","景甜","范冰冰"]
var array03 = array01 + array02
// 不建議一個數(shù)組中存放多種類型的數(shù)據(jù)
var array04 = [25, 44, "古天樂"] as [Any]
var array05 = ["艾薇兒","景甜","范冰冰",18] as [Any]
array04 + array05
七. 字典
(一). 字典的介紹
字典允許按照某個鍵來訪問元素
字典是由兩部分集合構成的膜宋,一個是鍵(key)集合,一個是值(value)集合
鍵集合是不能有重復元素的进肯,而值集合是可以重復的激蹲,鍵和值是成對出現(xiàn)的
Swift中的字典
Swift字典類型是Dictionary,也是一個泛型集合
*/
//(二). 字典的初始化
//Swift中的可變和不可變字典
//使用let修飾的數(shù)組是不可變字典
//使用var修飾的數(shù)組是可變字典
// 定義一個不可變字典
let dict = ["name" : "Fsocoiety", "age" : 18] as [String : Any]
// 定義一個可變字典
var dict1 : [String : NSObject] = String :NSObject
//在聲明一個Dictionary類型的時候可以使用下面的語句之一
var dict2: Dictionary<Int, String>
var dict3: [Int: String]
//聲明的字典需要進行初始化才能使用江掩,字典類型往往是在聲明的同時進行初始化的
// 定時字典的同時,進行初始化
var dict4 = ["name" : "Fsocoiety", "age" : 18] as [String : Any]
// swift中任意對象,通常不使用NSObject,使用AnyObject
var dict5 : Dictionary<String, AnyObject>
dict5 = ["name" : "陳冠希" , "age" : 28] as [String : Any] as Dictionary<String, AnyObject>
//(三). 字典的基本操作
// 添加數(shù)據(jù)
dict5["height"] = 1.89 as AnyObject?
dict5["weight"] = 72.0 as AnyObject?
// 刪除字段
dict5.removeValue(forKey: "height")
dict5
// 修改字典
dict5["name"] = "古天樂" as AnyObject?
dict5.updateValue( "古天樂" as AnyObject , forKey: "name")
dict5
// 查詢字典
dict5["name"]
//(四).字典的遍歷
// 遍歷字典中所有的值
for value in dict5.values {
print(value)
}
// 遍歷字典中所有的鍵
for key in dict5.keys {
print(key)
}
// 遍歷所有的鍵值對
//(五).字典的合并
// 字典的合并
var dict6 = ["name" : "PrinceMei","age":18] as [String : Any]
var dict7 = ["height" : 1.88, "Tel" : "+86 18526366356"] as [String : Any]
// 字典不可以相加合并
for (key,value) in dict6 {
dict7[key] = value
}
八. 元組
(一). 元組的介紹
元組是Swift中特有的,OC中并沒有相關類型
那什么是元組呢?
它是一種數(shù)據(jù)結(jié)構学辱,在數(shù)學中應用廣泛
類似于數(shù)組或者字典
可以用于定義一組數(shù)據(jù)
組成元組類型的數(shù)據(jù)可以稱為“元素”
// (二). 元組的定義
//元組的常見寫法
("0001","張三豐", 80, 70)
// 給元素加上元素名稱,之后可以通過元素名稱訪問元素
(id : "0001",name: "張三豐", age: 80, weight:70)
// (三). 元組的簡單使用
//用元組來描述一個HTTP的錯誤信息
// 元組:HTTP錯誤提示
let array = [404, "Not Found"] as [Any]
// 寫法一:
let error = (404, "Not Found")
print(error.0)
print(error.1)
// 寫法二:
let error1 = (errroCode : 404, errorInfo : "Not Found")
print(error1.errroCode)
print(error1.errorInfo)
// 寫法三:
let (errorCode,errorInfo) = (404,"Not Found")
print(errorCode)
print(errorInfo)
/*
九. 可選類型
(一). 可選類型的介紹
注意:
可選類型時swift中較理解的一個知識點
暫時先了解,多利用Xcode的提示來使用
隨著學習的深入,慢慢理解其中的原理和好處
概念:
在OC開發(fā)中,如果一個變量暫停不使用,可以賦值為0(基本屬性類型)或者賦值為空(對象類型)
在swift開發(fā)中,nil也是一個特殊的類型.因為和真實的類型不匹配是不能賦值的(swift是強類型語言)
但是開發(fā)中賦值nil,在所難免.因此推出了可選類型
可選類型的取值:
空值
有值
*/
// (二). 定義可選類型
//定義一個可選類型有兩種寫法
//最基本的寫法
//語法糖(常用)
// 錯誤寫法
// let string : String = nil //swift2.0
// 注意:name的類型是一個可選類型,但是該可選類型中可以存放字符串.
// 正確寫法:
// 寫法一:定義可選類型,語法糖(常用, 極力推薦)
let string : String? = nil
// 寫法二:定義可選類型
let name : Optional<String> = nil
// (三).可選類型的使用
// 演練一:給可選類型賦值
// 定義可選類型
var string0 : Optional <String> = nil
// 給可選類型賦值
// 錯誤寫法:因此該可選類型中只能存放字符串
//string0 = 134
// 正確寫法:
string0 = "I am Handsome"
// 打印結(jié)果
print(string0 as Any)
// 演練二:取出可選類型的值
// 取出可選類型的真實值(解包)
print(string0!)
// 注意:如果可選類型為nil,強制取出其中的值(解包),會出錯
//string0 = nil
//print(string0!) // 報錯
// 正確寫法:
if string0 != nil {
print(string0!)
}
// 簡單寫法:為了讓在if語句中可以方便使用string
// 可選綁定
if let str = string0 {
print(str)
}
// (四). 真實應用場景
//目的:讓代碼更加嚴謹
// 通過該方法創(chuàng)建的URL,可能有值,也可能沒有值.
// 錯誤寫法:如果返回值是nil時,就不能接收了
// 如果字符串中有中文,則返回值為nil,因此該方法的返回值就是一個可選類型,而使用一個NSURL類型接收是錯誤的
//let url : NSURL = NSURL(String: "www.520it.com") //錯誤寫法
// 正確寫法:使用可選類型來接收
//let url : NSURL? = NSURL(String: "www.520it.com")
// 該方式利用類型推導
let url1 = NSURL(string: "www.520it.com")
// 通過url來創(chuàng)建request對象:在使用可選類型前要先進行判斷是否有值
// 該語法成為可選綁定(如果url有值就解包賦值給tempURL,并且執(zhí)行{})
if let tempUrl = url1 {
let request = NSURLRequest(url: tempUrl as URL)
}
十. 類型轉(zhuǎn)化
常見的類型轉(zhuǎn)化符號
is : 用于判斷一個實例是否是某一種類型
as : 將實例轉(zhuǎn)成某一種類型
*/
//例子
// 1.定義數(shù)組
let array : [AnyObject] = [18 as AnyObject,"Jack" as AnyObject,1.85 as AnyObject]
// 2.取出數(shù)組中的第一個元素
let objc = array.first!
// 3.判斷第一個元素是否是一個Int類型
if objc is Int {
print("是Int類型")
}else {
print("非Int類型")
}
// 4.將objc轉(zhuǎn)成真正的類型來使用
// 4.1.as? 將AnyObject轉(zhuǎn)成可選類型,通過判斷可選類型是否有值,來決定是否轉(zhuǎn)化成功了
let age = objc as? Int
print(age!)
// 4.2.as! 將AnyObject轉(zhuǎn)成具體的類型,但是注意:如果不是該類型,那么程序會崩潰
let age1 = objc as! Int
print(age1)