Swift基礎語法

>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

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容