常量
定義常量的方法
- 我們先看一下最完整的定義常量的書寫格式:
let 常量名稱 : 常量類型 = 初始化值;
例:
let name : String = "lyu";
let age : Int32 = 18;
...
- Swift中的類型推導(dǎo)(不是推倒,別激動):
如果在定義變量(或常量)的同時進(jìn)行賦值(即完全初始化),那么變量(或常量)的類型可以省略,并且Swift會根據(jù)我們的賦值推導(dǎo)出變量(或常量)的類型,如下:
let n = 10 //實(shí)際上,現(xiàn)在這個n已經(jīng)有了明確的類型int
- 定義常量的快捷方法:
Swift中如果一行中只有一句代碼的時候允許省略末尾的分號;,再加上Swift的類型推導(dǎo)讓我們定義常量變得更加便捷,如下
let 常量名稱 = 初始化值;
例:
let name = "lyu"
let age = 18
拓展:
Swift是一個強(qiáng)類型的語言,它的任何一個標(biāo)識符都必須有明確的類型,如果一個變量(或常量)沒有明確的數(shù)據(jù)類型則編譯報(bào)錯,如下:
錯誤寫法:
let height //系統(tǒng)無法推導(dǎo)height的數(shù)據(jù)類型
正確寫法:
let height : Int32
變量
定義變量的方法
- 依舊先看一下最完整的定義常量的書寫格式:
var 變量名稱 : 變量類型 = 初始化值;
例:
var name : String = "lyu";
var age : Int32 = 18;
...
- 定義變量的快捷方法:
原理與定義常量相同,如下:
var 變量名稱 = 初始化值
例:
var name = "lyu"
var age = 18
...
- tips:
- 建議初學(xué)者優(yōu)先使用常量進(jìn)行定義,當(dāng)明確某一個常量需要修改的時候,在將其定義為變量
- 常量的本質(zhì)是指向的內(nèi)存地址不可以修改,但是當(dāng)我們通過內(nèi)存地址拿到一個實(shí)例化對象的時候,是可以通過內(nèi)存地址來修改對象的內(nèi)部屬性的,例如:
let view : UIView = UIView(); //實(shí)例化對象
view.frame = CGRectMake(100, 100, 100, 100); //雖然view是一個常量,但是我們?nèi)匀豢梢孕薷乃赶虻膶ο蟮膶傩?錯誤寫法如下:
view = UIView(); //無法使view指向一個新的對象
對象
實(shí)例化對象的方法
什么?實(shí)例化對象要先寫new?要alloc+init?你out了,Swift中實(shí)例化對象非常之簡單,我們簡單看兩個例子:
例1 view:
//下面簡單介紹三種創(chuàng)建UIView的方法
let view : UIView = UIView() //相當(dāng)于java中的new
let view : UIView = UIView.init(frame : CGRectMake(1,1,1,1)) //相當(dāng)于OC中的initWithFrame
let view : UIView = UIView(frame : CGRectMake(1,1,1,1)) //相當(dāng)于OC中的initWithFrame
//修改屬性
view.alpha = 0.8
view.backgroundColor = UIColor.redColor() //隨意修改一些屬性值,但是Swift中取消了smallTalk機(jī)制,一并換成了.點(diǎn)語法
//實(shí)例化UIButton對象的方法,對比其Swift中枚舉值的兩種寫法
let button : UIButton = UIButton(type: UIButtonType.Custom) //枚舉值寫法的改變(枚舉類型.具體類型)
let button : UIButton = UIButton(type : .Custom) //枚舉值的簡便寫法
//修改button的屬性
button.setTitle("按鈕",forStatus: .Normal)
//將button添加到父控件
view.addSubview(button) //添加控件
例2 controller:
let VC : UIViewController = UIViewController()
let navigationController : UINavigationController = UINavigationController(rootViewController:VC) //初始化rootViewController
實(shí)例化對象的方法大致如此
Swift的基本數(shù)據(jù)類型
這里大致介紹一下整型,以后有機(jī)會再補(bǔ)充吧...
Int8 : 有符號8位整型(相當(dāng)于C語言中的char)
Int16 : 有符號16為整型(相當(dāng)于C中的short)
Int32 : 有符號32為整型(相當(dāng)于C中的int)
Int64 : 有符號64為整型(相當(dāng)于C中的long)
Int : 默認(rèn),與平臺相關(guān)(例如:OC中的NSInteger)
UInt8 : 無符號8位整型(相當(dāng)于C語言中的unsigned char)
UInt16 : 無符號16為整型(相當(dāng)于C中的unsigned short)
UInt32 : 無符號32為整型(相當(dāng)于C中的unsigned int)
UInt64 : 無符號64為整型(相當(dāng)于C中的unsigned long)
UInt : 默認(rèn),與平臺相關(guān)(例如:OC中的unsigned NSUInteger)
基本運(yùn)算
- Swift中的數(shù)據(jù)類型沒有隱式類型轉(zhuǎn)換(*隱式類型轉(zhuǎn)換是指在C/OC等語法中,int類型與double類型進(jìn)行運(yùn)算時,系統(tǒng)自動將int類型提升至double類型,再進(jìn)行運(yùn)算)
錯誤寫法:
let a = 32
let b = 1.0
let sum = a + b //編譯報(bào)錯
- Swift中的類型轉(zhuǎn)換:
數(shù)據(jù)類型(變量名)
如,上面反例的正確寫法如下:
let a = 32
let b = 1.0
let sum = a + Int(b) //結(jié)果為33,整型
錯誤寫法:
let sum = a + (Int)b //Swift與OC剛好相反,小括號要將變量括起來,而不是標(biāo)識符
if邏輯分支
- Swift中if語法的注意點(diǎn)
- if后面的()可以寫也可以不寫,但是為了簡潔開發(fā),通常都不寫
- if的判斷語句沒有非0(非空)即真,也就是說if后面的判斷語句必須有明確的真假
- Swift中有明確的真假類型Bool,取值為ture或false,與java相同
- if后面的{}必須寫,與C或OC不同
例:
正確寫法:
let age = 18
if age < 18{ //就算大括號中只有一句話,也不可以省略大括號
print("未成年")
}
else{
print("成年")
}
錯誤寫法:
if age{}
if 1{}
//if后面必須有明確的真與假,所以上面做死循環(huán)的方法不可取,死循環(huán)正確的姿勢如下:
if age == 18{}
guard邏輯分支
Swift中的新型條件判斷語句guard(守衛(wèi),名字屌爆有木有),旨在提高代碼的可讀性,取代if的多層判斷,基本用法如下:
guard 條件語句 else{
結(jié)束語句 //break(switch或循環(huán)中使用)/continue(循環(huán)中使用)/return(函數(shù)中使用)
}
- 語法解釋:
- 條件成立,則跳過else繼續(xù)執(zhí)行
- 條件不成立,進(jìn)入else執(zhí)行代碼,而else必須包含結(jié)束語句,用于跳出當(dāng)前的循環(huán)或函數(shù),這是為了保證后面的代碼不執(zhí)行
func ageIf(age : Int , sex : Int){
guard age < 18 else{
return
}
guard sex == 1 else{
return
}
print("做我女朋友")
}
let age = 16
let sex = 1
ageIf(age, sex: sex)
keyMessage:guard多用在自定義函數(shù)或循環(huán)中
switch邏輯分支
重頭戲來了,Swift中的Switch不再那么雞肋,反而變得很強(qiáng)大,這點(diǎn)要與C和OC中區(qū)分開
- Swift中Switch的基本用法:
- switch后面的()可以寫也可以不寫
- case結(jié)束后可以不加break,不會穿透
- 如果想要執(zhí)行穿透效果,需要在case結(jié)束后添加一條語句:fallThrough
- case后面可以判斷多個條件,多個條件需要以,分隔
例:
let sex = 1 //1:代表男 2:代表女
switch sex {
case : 0 , 1
print("正常人")
default:
print("不正常人")
}
- 還沒完呢
- switch可以判斷浮點(diǎn)型數(shù)據(jù),字符串類型數(shù)據(jù)
switch option {
case "+":
result = a + b
case "-":
result = a - b
case "*":
result = a * b
case "/":
result = a / b
default:
print("錯誤")
}
- switch可以判斷區(qū)間
Swift中支持的兩種區(qū)間:
半開半閉區(qū)間:1..<10 表示數(shù)學(xué)中的:[1,9)
閉區(qū)間:1...10 表示 [1,10]
let age = 18
switch age{
case 0..<18:
print("未成年")
case 18...30:
print("青年")
default:
print("老年")
}
for循環(huán)
- for循環(huán)的幾種寫法如下:
- for后面的小括號可以省略
for var i = 0;i < 10;i++{ //一般用于從后往前遍歷,過期方法,不建議使用
print(i)
}
- 區(qū)間循環(huán)(做不到倒序遍歷):
for i in 0..<10{ //此時的i被推導(dǎo)為int類型
print(i)
}
- 如果不需要i,可以使用下劃線來替代
for _ in 0..<10{
print("hello")
}
while循環(huán)與"新版doWhile"循環(huán)(repeatWhile)
while循環(huán)
- 依舊可以省略while后面的()
- 依舊沒有非0即真和非空即真
錯誤寫法:
while(1){}//報(bào)錯
死循環(huán)的正確姿勢:
while(1!=0){}
repeatWhile(doWhile)
- while后面的()可以省略
- 沒有非0即真和非空即真
- do換成了repeat
var count = 0
repeat{
print("hello")
count += 1
}while count < 10
字符串/數(shù)組/字典
相比于OC中的字符串/字典/數(shù)組,Swift統(tǒng)一去掉了NS
- NSString改為String
- NSArray改為Array
- NSDictionary改為Dictionary
提示:
不要以偏概全哦:例如OC中的NSDate在Swift中仍然是NSDate...
字符串String
- Swift中字符串的特點(diǎn):
- String是一個結(jié)構(gòu)體,相對于對象(NSStrign)來說性能更高
- String支持直接遍歷
- Swift提供了String和NSString之間的無縫轉(zhuǎn)換
- 創(chuàng)建字符串:
- 可變字符串
let str = "hello"
- 不可變字符串
var strM = "hello"
strM = "hello swift"
- 字符串的使用
- 遍歷字符串
for character in str.characters {
print(character)
}
- 獲取字符串長度
let length = str.characters.count
- 字符串的拼接
- 字符串與字符串之間的拼接
let str = "lyu"
let str2 = "sim"
let str3 = str + str2
print(str3)
- 字符串與其他標(biāo)識符之間的拼接
let name = "lyu"
let age = 18
let str3 = "name is \(name) and age is \(age)"
print(str3)
- 字符串與其他標(biāo)識符之間的格式化拼接
let str = "lyu"
let age = 18
let str3 = String(format: "name is \(str) , age is %i" ,age)
- 字符串的截取
- 使用Swift原生方法截取?
let urlString = "www.lyu.com"
//由于Swift中substringWithRange中的range泛型指定為Index類型,所以才導(dǎo)致創(chuàng)建區(qū)間如下面這般麻煩
let startIndex = urlString.startIndex.advancedBy(4) //創(chuàng)建區(qū)間起始
let endIndex = urlString.endIndex.advancedBy(-5) //創(chuàng)建區(qū)間末尾
let range = Range(startIndex...endIndex) //創(chuàng)建區(qū)間
let name = urlString.substringWithRange(range) //截取中間
let www = urlString.substringToIndex(startIndex) //截取到...
let com = urlString.substringFromIndex(endIndex) //從..開始截取
- 使用OC方法截取
let urlString = "www.lyu.com"
let name = (urlString as NSString).substringWithRange(NSMakeRange(4, 3)) //轉(zhuǎn)換字符串,并使用OC方法來進(jìn)行截取
let com = (urlString as NSString).substringFromIndex(8)
let www = (urlString as NSString).substringToIndex(3)
數(shù)組
- 不可變數(shù)組:
let array = ["lyu","sim"]
- 可變數(shù)組:
var arrayM = Array<NSObject>() //不常見的寫法,只因不夠簡潔
var arrayM = [NSObject]()
- 數(shù)組的基本操作(增刪改查)
- 增
arrayM.append("lyu") //增加字符串
arrayM.append(18) //增加基本數(shù)據(jù)類型
- 刪
arrayM.removeAtIndex(1) //18被刪除掉了
- 改
arrayM[0] = "sim"
arrayM[1] = "18" //此例中,越界報(bào)錯
- 查
let name = arrayM[0] //取出數(shù)組的第0個元素
- 數(shù)組的遍歷
- 普通for循環(huán)遍歷:這種方法在Swift 3.0中即將被取消,請遺忘
let array = ["lyu" , 18]
for var i = 0 ; i < array.count ; i++ {
print(array[i])
}
- 增強(qiáng)for循環(huán)遍歷:
let array = ["lyu" , 18]
for name in array {
print(name)
}
- 超強(qiáng)for循環(huán)遍歷:既能拿到index,又能拿到元素(簡直碉堡)
let array = ["lyu" , 18]
for (index , name) in array.enumerate(){
print(index)
print(name)
}
- 部分遍歷:如果有只遍歷數(shù)組中某部分元素的需求,那么就使用下面這種方法吧
let array = ["lyu" , 18]
for index in 0...1 {
print(array[index])
}
- 數(shù)組的合并
數(shù)組的合并是有前提的:兩個數(shù)組中對應(yīng)index的元素類型必須一致,才能進(jìn)行合并
正確寫法:
let array1 = ["name1" , 17]
let array2 = ["lyu" , 18 , 19 , "sim"]
let arrayT = array1 + array2
錯誤寫法:
let array1 = ["name1" , 17]
let array2 = ["lyu" , "sim"]
let arrayT = array1 + array2 //編譯報(bào)錯
字典
不可思議的是,Swift中的字典仍然使用[]來創(chuàng)建(而不是{}),Swift會通過[]中的內(nèi)容來判斷自己是一個字典還是數(shù)組(如果里面存放的是鍵值對,Swift會判定其為字典,如果里面存放的是元素,Swift會判定其為數(shù)組)
- 不可變字典
let dic = ["name" : "lyu" , "age" : 18]
- 可變字典
var dicM = Dictionary<NSString , NSObject>() //不常用
var dicM = [NSString : NSObject]()
- 可變字典的基本操作
- 增
dicM["name"] = "lyu" //第一種方法
dicM.updateValue(18,forKey:"age") //第二種方法
keyMessage:如果key已經(jīng)存在了,那么所謂的增就變成了改了哦
- 刪
let name = dictM.removeValueForKey("age") //Swift中被刪除掉的元素是可以拿到的
- 改
dictM["name"] = "lyu"
dictM.updateValue("lyu",forKey:"name")
- 查
let name = dicM["name"]
- 字典的遍歷
- 遍歷key
for key in dic.keys {
print(key)
}
- 遍歷value
for value in dic.values {
print(value)
}
- 遍歷key/value:
for (key , value) in dic {
print(key)
print(value)
}
- 字典的合并:
然而,字典并不能合并,就算元素類型相同也不可以,不過如果真的有讓兩個字典合并為一個字典的需求,可以這樣做:
let dic = ["name" : "lyu" , "age" : 18]
var dicM = [NSString : NSObject]() //將其中一個字典變?yōu)榭勺冏值?作為被合并的字典
dicM["height"] = 1.80 //為可變字典添加屬性
for (key,value) in dic { //合并字典
dicM[key] = value
}