Swift語法

1優點:

Swift是由蘋果公司在2014年推出的,用來寫OSX和IOS程序

能看得到的好處:

一般都是一行一句代碼,沒有了分號; 運行速度更快;舍棄了Smalltalk語法,方法調用和枚舉使用點語法,更加現代; 取消了OC指針;語言更加精簡:沒有.h和.m,沒有main.m文件,在AppDelegate.Swift里 ?類的定義沒有@implementation,使用大括號;當前對象如果訪問的是自己的屬性或者方法,self可以省略,但是在閉包里需要使用;添加事件,方法前不是@改為#,字符串沒有@,打印使用print;有自動類型推導的功能,推導出變量的準確類型;沒有隱式轉換,不同類型的值做運算會報錯,必須進行顯式轉換;可選類型,類型名后加?,可選值為nil,不允許參與計算;整數默認是Int,小數默認是Double;條件判斷,還有switch,for循環;函數內部不能使用外部參數,外部參數都是給調用方用的,使調用方明白每個參數的意思;提供OC與Swift無縫轉換

?更加安全(譬如說,數據溢出的時候,會給出警告) ?

命名空間

?泛型

? 支持方法重載(是面向對象的一個重要特征),oc不支持重載

沒有非空即真或者非零即真,必須有明確真假

2學習方式

選擇playground創建測試代碼

3定義常量使用let 變量使用var 小數默認是double

4 ?let a = 10

let a : Int = 20 ? ? ? var b : Double = 2.44

強類型語言,任何一個標識符都有明確的類型

不指定類型,可以根據等號后邊的值自動推導 ? ?

指定類型的常量let c : Double = 20.5

let result = a + c 報錯 在Swift里沒有隱式轉換

5定義數據類型,先使用let 再提示的時候改為var

定義格式:let /var 標識符名稱 : 類型 = 賦值

6 可選類型:定義的常量或者變量可能有值,可能為nil(沒有值),不能直接參與計算

只有可選類型才能接收 nil這個參數 ?let a : String ?= nil錯誤 ? ? 可以這樣,let a : String ? = nil

可選表現形式:類型名后加? ? ? ? ? ?let a : Int? = 10 ? ? ? let b = 20 ? ?let result = a! + b ? ?!表示強制解包

使用!向系統保證我的值一定存在,不能是 nil

實現:if a != nil {

let result = a! + b

print(result)

}

使用空合運算符: ??

let result = a + b

let result = (a ?? 0) + b

判斷a是否有值,如果有值,直接使用a ,如果沒有,直接使用默認值0,a是什么類型,默認值就是什么類型


有可能出現多次強制解包:

let url: URL? = URL(string:"http://www.baidu.com哈哈“)

if url != nil {

let urlRequest ?= URLRequest(url :url!)//出現多次強制解包

print(urlRequest)

}else {

print(url不合法”)

}

改進:使用if let語句 ? 會先判斷url是否為nil,如果不為nil,對u進行賦值,直接執行if let語句

if let u = url {

let urlRequest = URLRequest(url : u)//執行到此,表示一定有值,就不用再進行強制解包

print(urlRequest)

}else {

print("url不合法“)

}

再次改進:

另一種:guard let 守護的可選類型一定有值,否則不執行else語句

guard let u = url else {

print("不合法”)

return

}

let urlReuqest = URLRequest(url:u)//執行到此表示一定有值,不用強制解包

print(urlRequest)


多個可選類型的判斷

let name: String? = "張三“

let age : Int? = 20

if let n = name,var a = age {//兩個是并且的關系

a = 21

}}


多個條件判斷,iflet 可以加上條件判斷

if let u = url, u.host == "www.baidu.com" {

print(”我是百度“)}


多個可選類型,多個條件的判斷

let name: String? = "張三”

let age : Int? = 20

if let n = name,let a = age,n == "張三“&& a== 20{

print("名字:\(n),年齡:\(a)")

}

常見錯誤:

fatal error:unexpectedly found nil while unwrapping an Optional value ?對可選類型值為nil進行強制解包報錯

變量可選類型默認值是nil ? var d : Int?

常量可選類型沒有默認值,使用的時候必須初始化,可以初始化為nil ? let f : Int ? = nil


7控制流:

沒有非0即真 ?if num { } ? 必須是一個bool類型值,只有true/false ?if num > 5 {}

三目運算符:var a = 10; var b = 20;let c = a > b ? a : b

8Switch

沒有break,可以判斷任意數據類型;可以省略小括號;在case里定義變量不需要添加括號;判斷多個參數;fallthrough case后不能定義常量或者變量;case或者default后必須跟一條可執行語句,(break也行)

let score = 90

switch socre{

case let x where x >90:

print("優秀”)

或者

case _ where score > 90:


沒有for循環,只有for-in ,repeat-while

? o..<5范圍[0,5) ? ?0...5[0,5] ? ?

do-while改為 repeat-while


9String關鍵字,是一個結構體,量級比NSString 輕,性能更好

let str = "hello" ? ? ? var str: String = "你好"

獲取字符串的長度:

let length = str.characters.count

Swift里String與NSString 可以做無縫轉換:使用as

let len1 = (str as NSString).length

拼接: let result = str1 + str2; ? ? ?str3 += swift ? ?str3 += String(year)

整形轉化為字符串拼接

let message = result + "\(year)"

let month: Int? = 5

let message2 = ”今年是第\(month!)個月"

let infoStr = “my ?name is \(name),age is \(age),height is \(height)”

格式化拼接:let min = 3 ; ?let second = 12 ; let timeStr = String(format:"%02d:%02d",min,second)

字符串截取

方式一:轉換為oc ?NSString

let urlString = “www.520it.com”

let header1 = (urlString as NSString).substring(to:3)






10函數

在類里寫 叫做方法

func demo(){

print("午餐午飯”)

}

func demo1() -> Void {

print("無返回值的方式2")

}

func demo2()->() {

print("無返回值的三種方式”)

}

嵌套函數:只能在函數的內部使用,外部訪問不了

func show(){

func demo1() {

print(“哈哈”)

}

demo1()

}



有參有反

func sum(a:Int,b:Int) ->Int{

return a + b

}


外部參數和內部參數

函數內部不能使用外部參數,外部參數都是給調用方用的,使調用方明白每個參數是什么意思

func mul (num1 a : Int,num2 b : Int) -> Int {

return a * b

}


11閉包:let closure = { (參數名:參數類型,。。。)->返回值類型 in

//執行代碼 ?in 用來區分函數定義和代碼實現

}

無參無返回值的閉包:

func demo1(){

let closure = {

print("哈哈“)

}


func demo2(){

let closure = {() in

print("hah ")

}

let closure1 = {()-> Void in

print(”哈哈“)

}

let closure2 = {()->() in

print("哈哈”)

}

closure()

}


有參有返回值的閉包

func demo3() {

let closure = {(num1 : Int, num2 : Int) -> Int in

return num1 + num2

}

let result = closure(10,10)

print(result)

}


12as 類型轉換
















































、

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

推薦閱讀更多精彩內容