一下筆記是在學(xué)習(xí)swift的時(shí)候做的,比較亂,可以將就的看一下,swift這一門語言我認(rèn)為是比較理性理想的,比oc來說感覺更合理,如果swift真要是熟練了,在開發(fā)過程中肯定比oc簡單的多.
常量與變量
/*
let:常量一經(jīng)賦值就不能被更改
var:變量可以被更改
盡量使用常量等到需要修改的時(shí)候在改成使用var來修飾
option + click最常用的熱鍵值沒有之一
在swift中整數(shù)的默認(rèn)類型是Int OC中: NSInteger
小數(shù)的默認(rèn)類型是Double
OC沒有默認(rèn)的小數(shù)類型
1.swift中數(shù)據(jù)的類型是自動(dòng)推導(dǎo)的根據(jù)'='右邊的類型來去推斷變量的具體類型
2.swift是一個(gè)類型極其苛刻的語言
3.不同的數(shù)據(jù)類型之間不能夠直接運(yùn)算swift中不支持隱含形式的轉(zhuǎn)換類型
4.提前聲明類型: let變量名:類型
可選項(xiàng)與必選項(xiàng)
//可選項(xiàng): ?(有值嗎)? 1.有值2.沒有值(nil)
//必選項(xiàng): !程序員承諾一定有值同樣也表示強(qiáng)制解包
//可選項(xiàng)是OC程序員接觸到swift最不適應(yīng)的一個(gè)地方
//1.加強(qiáng)對(duì)可選項(xiàng)的理解
//2.可以根據(jù)Xcode的智能提示來進(jìn)行解決
//3.每添加一個(gè)'!'的時(shí)候都需要思考為什么,安全嗎程序員承諾一定有值
//fatal(致命的) error: unexpectedly found nil while
unwrapping(解包) an Optional value
/*
1.可選項(xiàng)在打印的時(shí)候會(huì)自動(dòng)帶上Optional(10)
2.可選項(xiàng)不能夠直接參與運(yùn)算
*/
funcdemo1() {
//聲明可選項(xiàng)在類型后面追加'?"
vara:Int?
if(a !=nil){
print(a! +10)
}
}
swithc case
//switch
case
//1.每個(gè)case分支必須要有一段可以執(zhí)行的代碼
//2.臨時(shí)變量的定義不需要加在{}中
//3.OC中只能判斷基本數(shù)據(jù)swift中可以判斷任意類型(字符串)
//4.可以同時(shí)case多個(gè)選項(xiàng)
//5.不需要寫break
funcdemo7() {
letm ="22200"
switchm {
case"18000","22200":
leti =10
print("高級(jí)工程師")
case"8000":
print("初級(jí)工程師")
default:
print("你是猴子派來的嗎")
}
}
"??"雙問好操作符
// ??在判斷字符串或者基本數(shù)據(jù)類型的時(shí)候用處很大
//操作符:快速判斷可選項(xiàng)是否為nil如果為nil給定默認(rèn)值
//
tableView數(shù)據(jù)源方法list?.count ?? 0
funcdemo6() {
vara:Int?
//必選項(xiàng)
letb = (a ??1) +10
print(b)
}
分支結(jié)構(gòu)
//guard(守衛(wèi)) let ... else和if let的作用剛好相反
//能夠減少一層分支嵌套
//Xcode
7.0? swift2.0才推出的語法
//在項(xiàng)目使用的非常多
funcdemo5() {
leturlString
="http://www.douni.com?type=中國"
guardleturl =NSURL(string: urlString)else{
//如果url為nil當(dāng)前代碼就直接返回
return
}
//程序運(yùn)行到這里'守衛(wèi)'的對(duì)象就一定有值
letrequest =NSURLRequest(URL: url)
print(request)
}
//
if let快速賦值并且判斷是否為空不為空才能夠進(jìn)入分支意味著值就是一個(gè)必選項(xiàng)
funcdemo4() {
//url中包含中文需要轉(zhuǎn)義
leturlString ="http://www.douni.com?type"
ifleturl =NSURL(string: urlString) {
letrequest =NSURLRequest(URL: url)
print(request)
}
}
weak和unowned的區(qū)別
weak回收掉時(shí)自動(dòng)指向nil安全unowned相當(dāng)于assign,回收掉的時(shí)候指向原來的地址,是野指針不安全
swift面向?qū)ο蟮某跏蓟^程-->先初始化子類-->再初始化父類和oc相反
重寫是父類有同樣的方法或者屬性
重載是面向?qū)ο蟮?相同的方法名得到不同的功能
Git.OSChinaNeXTSTEP
函數(shù)的應(yīng)用
/*
swift中調(diào)用本類的函數(shù)和屬性self可以省略也可以加上閉包內(nèi)調(diào)用本類的函數(shù)和屬性時(shí)必須加self
*/
classViewController:UIViewController{
overridefuncviewDidLoad() {
super.viewDidLoad()
//函數(shù)的調(diào)用
//函數(shù)的第一個(gè)參數(shù)名稱可以省略
//
let result = square(width: 10, height: 20)
//
print(result)
}
//函數(shù)的外部參數(shù)
//外部參數(shù)width是提供給調(diào)用方來進(jìn)行使用的
//內(nèi)部參數(shù)a是提供給函數(shù)內(nèi)部使用的
funcsquare(width a:Int,heightb:Int) ->Int{
returna * b
}
//函數(shù)沒有返回值的三種寫法
//1.沒有返回值的第一種寫法
funcdemo1() -> () {
print("哈哈哈")
}
//2.第二種寫法Void V要大些
funcdemo2() ->Void{
print("嘻嘻嘻")
}
//3.函數(shù)沒有返回值的第三種寫法
funcdemo3() {
print("黑hi額hi額")
}
便利的構(gòu)造函數(shù)
convenienceinit?(name:String, age:Int){
//通常年齡需要做合法性的檢查讓一個(gè)人年齡在一個(gè)合法區(qū)間內(nèi)
ifage <0|| age >1000{
//不能夠?qū)嵗搶?duì)象必須是失敗的構(gòu)造器才能夠返回nil
returnnil
}
//保證對(duì)象在滿足條件下能夠被實(shí)例化
//生寫指定構(gòu)造函數(shù)
self.init(dict:["name": name,"age": age])
}
便利構(gòu)造函數(shù)是為本類中已經(jīng)實(shí)例化的屬性或者方法添加限制條件,調(diào)用本類的構(gòu)造方法,使用self.init,不能用super和被重寫,也可以被繼承
在swift中創(chuàng)建項(xiàng)目名稱的時(shí)候,如果項(xiàng)目名稱是(數(shù)字.中文),會(huì)在向數(shù)組中添加元素可能會(huì)報(bào)野指針的錯(cuò)誤,血的教訓(xùn)
類型轉(zhuǎn)換as的使用
1.as, String <==> NSString[XXX] <==> NSArray[key : value] <==> NSDictionary
2.as?接收的數(shù)據(jù)類型是可選類型就使用as?嘗試性的去轉(zhuǎn)換一次
3.as!結(jié)束的數(shù)據(jù)類型是必選類型一定需要轉(zhuǎn)換某一個(gè)類型
構(gòu)造函數(shù)必須保證每個(gè)必選屬性都初始化有初始值
2x對(duì)應(yīng)是4和4s的屏幕尺寸3.5的屏幕640 x 960 pixels
Retina4對(duì)應(yīng)的是5,5s,5c的屏幕640 x 1136 pixels
Retina4.7對(duì)應(yīng)的是6和6s的屏750 x 1334 pixels
Retina5.5對(duì)應(yīng)的是6plus和6splus的屏幕1242 x 2208 pixels
在眾多類中找出自己要快速查看的代碼
打開視圖層次查看器找到對(duì)應(yīng)的文件復(fù)制文件名
cmd+ shit + o快速查找文件
cmd+ shit + j快速定位文件
使用addTarget添加點(diǎn)擊時(shí)候的時(shí)候,如果不希望外界訪問方法前加private但是運(yùn)行時(shí)候會(huì)蹦
因?yàn)橐坏┦褂昧薬ddTarget在運(yùn)行循環(huán)時(shí)候無法找到該方法
在方法前添加@objc告訴運(yùn)行循環(huán),這個(gè)方法是基于OC消息動(dòng)態(tài)派發(fā)機(jī)制來執(zhí)行的
//自定義訪客視圖
//默認(rèn)的構(gòu)造方法一旦從寫init(frame方法會(huì)自動(dòng)調(diào)用required init?(coder
aDecoder: NSCoder) {
overrideinit(frame:CGRect) {
//調(diào)用父類的構(gòu)造方法
super.init(frame:frame)
setupUI()
}
//一旦重寫了init(frame方法之后系統(tǒng)會(huì)默認(rèn)該視圖會(huì)通過手寫代碼創(chuàng)建
//系統(tǒng)就不會(huì)再讓同構(gòu)xib加載視圖
//通過xib加載的UIView及其子類會(huì)調(diào)用這個(gè)方法
requiredinit?(coderaDecoder:NSCoder) {
//系統(tǒng)默認(rèn)在這個(gè)地方執(zhí)行報(bào)錯(cuò)
fatalError("init(coder:) has
not been implemented")
//如果重新了init(frame方法但是還想要從xib中加載試圖,注釋上面一行代碼,調(diào)用下面一行代碼
//super.init(coder:
aDecoder)
}
關(guān)于對(duì)loadVIew的使用
//用戶是否登錄的標(biāo)記'
varuserLogin =false
//訪客視圖屬性
varvisitorLoginView:VisitorLoginView?
//loadView方法是蘋果專門為手寫代碼準(zhǔn)備的方法一旦實(shí)現(xiàn)了該方法xib/sb就會(huì)失效
//在loadView方法沒有調(diào)用super.loadView方法之前不能夠追蹤根視圖(view)會(huì)自動(dòng)檢測view是否為nil如果為nil會(huì)自動(dòng)調(diào)用loadView方法
//準(zhǔn)備視圖控制器的根視圖
//自定義根視圖就在這個(gè)方法中完成
//目標(biāo)是根據(jù)用戶是否登錄來顯示訪客視圖還是tableView
overridefuncloadView() {
ifuserLogin{
super.loadView()//加載tableview
}else{
//顯示自定義的訪客視圖引導(dǎo)用戶登錄或者注冊(cè)
visitorLoginView=VisitorLoginView()
//指定代理
visitorLoginView?.visitorLoginViewDelegate=self
//
v.backgroundColor = UIColor.purpleColor()
view=visitorLoginView