>1swift來歷:2014年推出,具有安全,現代,互動,快速的特點.
>2playground可以用來測試,學習新代碼.新建playground,可以快速發現版本升級時swift語法的變化.
>3變量和常量
let x: String = “zhangsan” 定義后不可改變 ;var y: Int = 10,定義后可以改變 ,當沒有指定具體類型時,Swift會對根據等號右邊的內容進行自動推導為String,Int,Double
>4不同類型的變量不能直接進行運算,需要強制轉換
>5可選項
let x: Int? = 10 可選項格式
let y = x! + 100 可選項使用,需要解包,當x為nil時,解包會報錯,改進:
let y = (x ?? 0) + 100 (1)
if x != nil{ let y = x! + 100 }?(2)
if let c = x {y = x! + 1000} (3)
>6控制流 Swift中沒有非零即真的概念,必須明確的指明判斷條件true/false
var x: Int? = 10
var m: Int? = 20
if let y = x { ?//使用這種判斷方法較方便
x = 100
}
多重判斷條件: if let y = x ,let z = m{
y = ...
z = ...
}
let point = CGPoint(x: 10, y: 10)
switch point{
case let p where p.x == 0 && p.y == 0:
print(“中心點”)
default:
print(“非中心點")
}
//單獨判斷時,switch的賦值部分可以省略
switch point{
case _ where point.x == 0 && point.y == 0:
print(“中心點”)
default:
print(“非中心點")
}
>6for循環
var sum: Int?
for i in 0..<10{ //不包括10
sum += i
}
for i in 0…10{//包括10
sum += i
}
for _ in 0…10{//當不用變量時,可以省略
print(10)
}
>7字符串
let str = “你很不一般"
//遍歷
for ch in str.characters{
print(ch)
}
//長度
str.characters.count
str.utf8.count //編碼字節長度
//拼接
str + “不一般啊不一般"
//轉譯形式(“\()")
//格式化字符串
let timeStr = String(format:”%02d:%02d:%02d”,arguments:[h,m,s])
//子字符串
varstr ="中國人很厲害"
letstartIndex = str.startIndex.advancedBy(0)
letendIndex = str.endIndex.advancedBy(-1)
letstr1 = str.substringWithRange(startIndex..
(str as NSString).substringWithRange(NSMakeRange(2,3))
>8數組
//定義空數組
var array = [String]()
array.append(“laozhang")
array.capacity//數組的容量,如果不夠用,直接*2
array + [“1”,”2"]
array.removeFirstObject
let str = array[0]
//*當數組中存儲結構體時,需要轉變成NSValue的類型
var array1 = [“zhang”,18]
array1.append(NSValue(CGPoint: CGPoint(x: 10,y: 10))
>9字典
var dict = [“name” : “zhang”,”age” : 18] //常用字典類型 [String : NSObject]
dict[“no”] = “110"
for (a,b) in dict{
print(a,b)
}
>9函數
func demo() { 函數體 }//無參無返回值的最簡單形式
func demo1(外部參數名1 內部參數名1: 參數類型, …) -> 返回值類型 { 函數體 }//有參有返回值函數
>10閉包
{ 代碼實現 }//無參無返回值的閉包,最簡單的形式
{ (參數1: 參數類型,…) -> 返回值類型 in 代碼實現 }//有參有返回值的閉包
函數是閉包的一種特殊形式,可以類比構造函數
當閉包是函數的最后一個參數時,小括號可以提前結束,當做尾隨閉包來使用
>11函數循環引用的解決方案
deinit //析構函數,當對象釋放的時候執行
__weak typeof(self) weakSelf = self (1)//釋放后self指向nil
__unsafe__unretain typeof(self) weakSelf = self (2)//釋放后成為野指針
__weak typeof(self) weakSelf = self (3)
{ __strong typeof(self) strongSelf = weakSelf }
>12閉包循環引用的解決
loadData {[weak self] in
}(1)
loadData {[unowned self] in
}(2)
>13構造函數
一個類中定義的必選屬性,需要通過構造函數對其進行初始化
重寫父類的構造函數: override init( ?) { ?}
重載構造函數: init(name: String,age: Int){ ?}
本類的屬性初始化操作需要放在調用super.init()之前,保證本類屬性初始化完成
重寫/重載的構造函數本身默認都會調用super.init()完成父類的初始化
>14KVC
可選屬性開始時并沒有分配存儲空間
var age: Int = 0//默認對Int的屬性進行復制后,才能為Int的屬性開辟空間
KVC運行實質是不斷發送setValue: forKey消息
KVC語句放在super.init() 后,保證對象初始化完成
>14便利構造函數
convenience?init?(name:?String,?age:?Int)?{
if?age?<?20?||?age?>?100?{
return?nil
}
self.init(dict:?["name":?name,?"age":?age])
}
便利構造函數可以返回nil
只有在便利構造函數中可以使用self.init()
便利構造函數不可以被重寫或super,但可以被繼承
>15懶加載
lazy var person: Person = {
return Person( )
}( ) //格式
lazy var person: Person = Person( )//簡單寫法
>16存儲型屬性
var title: String {
get {
return “Mr” + (name ?? “")
}
}//格式
var title: String {
return “Mr” + (name ?? “")
}//簡化格式 //不占用內存空間
var person: Person {
didSet{
self.nameL.text = person.name
self.ageL.text = person.age
}
}