
前言
總結(jié)下 swift下的基礎(chǔ)語法,里面涉及到:常量&變量、Swift中的數(shù)據(jù)類型、邏輯分支、循環(huán)、字符串相關(guān)、數(shù)組和字典、方法的書寫調(diào)用等內(nèi)容,考慮到閱讀體驗分多篇來展示,希望對大家學(xué)習(xí)swift有所幫助,同時也是對自己的一個總結(jié)。
Swift| 基礎(chǔ)語法(一)
Swift| 基礎(chǔ)語法(二)
Swift| 基礎(chǔ)語法(三)
Swift| 基礎(chǔ)語法(四)
Swift| 基礎(chǔ)語法(五)
本文涉及:
- Swift的語法特點
- Swift中的!和 ?的用法總結(jié)
- Swift中的!和 ?的用法總結(jié)
Swift的語法特點
從它的語法中能看到Objective-C、JavaScript、C#、Python等語言的影子。
其借鑒了Objective-C、JavaScript、C#、Python等語言的優(yōu)點。
同時具備編譯型語言的高性能和腳本語言的靈活交互性。
(編譯型語言:就是要保證我們所寫的代碼全部編譯通過,程序才能執(zhí)行;
腳本語言:你寫的代碼對一行執(zhí)行一行,比如你寫了10行,第9行有Bug,那么前8行是可以執(zhí)行成功的)
Swift和其它編程語言相比有哪些變化?
1、沒有main函數(shù),其它編程語言認(rèn)為mian函數(shù)是程序的入口,Swift認(rèn)為程序是從上往下一行一行執(zhí)行的,
因此第一行代碼就是程序入口。
2、語句結(jié)束時不需要加”;”,當(dāng)然若你喜歡也是可以加”;”
3、如果同一行有多個語句,則依然需要加”;”,不建議一行寫多條語句。
4、定義標(biāo)識符時必須聲明該標(biāo)識符是變量還是常量。
5、聲明標(biāo)識符的格式:變量/常量關(guān)鍵字 名稱:數(shù)據(jù)類型
(當(dāng)然你也可以不寫數(shù)據(jù)類型,Swift會自動根據(jù)初始值確定其類型),示例如下:
// 聲明一個String類型的變量
var name:String = "android_ls"
// 聲明一個String類型的常量
let desc:String = "做android開發(fā)的iOS程序員"
若你不想按上面的格式聲明一個變量或者常量,可以采用下面這種寫法,示例如下:
// 聲明一個String類型的變量
var name = "android_ls"
// 聲明一個String類型的常量
let desc = "做android開發(fā)的iOS程序員"
6、.( )表示初始化 也可以表示執(zhí)行
7.在swift中 默認(rèn)所有的文件共享 所有的對象的方法也是默認(rèn)可以調(diào)用
8.命名空間: 在同一個項目下 叫做命名空間 在同一個命名空間下 所有的文件共享
9.swift 屬性默認(rèn)都是 強(qiáng)引用的
10.swift中 init 方法 就是構(gòu)造方法,并且所有的構(gòu)造方法 都叫 init
11.在Swift中,運算符不能直接跟在變量或常量的后面。
Swift中的!和 ?的用法總結(jié)
Swift語言使用var定義變量,但和別的語言不同,Swift里不會自動給變量賦初始值,也就是說變量不會有默認(rèn)值,
所以要求使用變量之前必須要對其初始化。如果在使用變量之前不進(jìn)行初始化就會報錯:
Optional其實是一個enum枚舉值,它有兩個值:None和Some。Optional.None其實就是nil,
Optional.Some就是非nil,它會通過Some(T)來進(jìn)行Wrap包裝原始值,
這也是為啥使用Optional類型的時候要進(jìn)行拆包unWrap(從enum中讀取原始值)了。
聲明為Optional只需要在類型后面緊跟一個?或者!即可,如:
var strValue: String? //?相當(dāng)于下面這種寫法的語法糖
var strValue: Optional<String>
上面的?這個Optional可選項類型聲明,意思是我聲明了一個Optional類型,而不是聲明了一個String類型,
它可能包含一個String值,也可能不包含,不包含默認(rèn)值就為nil。我們可以通過if判斷來區(qū)分是否為nil:
if strValue {
//do something with strValue
}
那么我們怎么使用Optional可選類型的值呢?直接在后面加上一個?號即可。
如果是nil值,也就是Optional.None,會跳過后面的操作不執(zhí)行,
如果有值,也就是Optional.Some,就會進(jìn)行unWrap拆包操作,比如:
//正確
let hashValue = strValue?.hashValue
//錯誤
let hashValue = strValue.hashValue
有一種特殊情況,假如我們非??隙╯trValue一定是非nil的,我們也可以采用強(qiáng)制拆包處理:使用!
let hashValue = strValue!.hashValue
!就代表強(qiáng)制拆包,假如strValue是nil,你強(qiáng)制拆包也會報錯
問號?
a.聲明時添加?,告訴編譯器這個是Optional的,如果聲明時沒有手動初始化,就自動初始化為nil。
b.在對變量值操作前添加?,判斷如果變量時nil,則不響應(yīng)后面的方法。
嘆號!
a.聲明時添加!,告訴編譯器這個是Optional的,并且之后對該變量操作的時候,都隱式的在操作前添加!
b.在對變量操作前添加!,表示默認(rèn)為非nil,直接解包進(jìn)行處理。不小心讓改變量為nil,程序就會crash掉。
swift 中 as as! as? 區(qū)別
(1)as :
僅當(dāng)一個值的類型在運行時(runtime)和as模式右邊的指定類型一致、或者是該類型的子類 的情況下,
才會匹配這個值。如果匹配成功,被匹配的值的類型被轉(zhuǎn)換成as模式左邊指定的模式。
as 應(yīng)用條件有2種情況:
(1)、和“as”右邊類型一致 =
(2)、是右邊類型的子類 <
class ball {}
class football:ball {}
let a = ball()
a as ball //a和右面的ball類型一致,編譯成功
let f = football()
f as ball // d 是右面ball的子類,編譯成功
(2) as!
如果碰到as左邊類型是右邊類型的父類,則會報錯!as不可以用來父類轉(zhuǎn)子類,這個時候可以用強(qiáng)轉(zhuǎn) as! >
class ball {}
class football:ball {}
let a = ball()
a as ball // 編譯成功
let f = football()
a as football // 編譯報錯
編譯器會提醒你用as!
(3)as?
as?相當(dāng)于optional類型,如果強(qiáng)轉(zhuǎn)失敗的話會返回nil。
class ball {}
class football:ball {}
class basketball:ball {}
let aball:ball = basketball()
aball as? football // 取到的是nil
aball as! football //運行時報錯