- 在Mac終端輸入
swift
可查看當(dāng)前系統(tǒng)所支持的Swift語言的版本苞慢,如下所示:
- 在Mac終端輸入
xcrun swift -version
,可查看Xcode版本對應(yīng)的Swift版本英妓,如下所示:
image.png
- 在Mac終端輸入
xcodebuild -showsdks
挽放,可查看Xcode所支持的系統(tǒng)版本,如下所示:
image.png
Swift初次體驗(yàn)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let a = 100; let b = 200
print(a+b)
let view1 = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view1.backgroundColor = UIColor.red
view.addSubview(view1)
let button = UIButton(type: UIButton.ButtonType.contactAdd)
button.center = view.center
button.addTarget(self, action: #selector(click(button:)), for: UIControl.Event.touchUpInside)
view.addSubview(button)
}
//按鈕的監(jiān)聽回調(diào)
@objc func click(button: UIButton){
print("點(diǎn)擊")
}
}
- 在Swift中蔓纠,一段代碼之后不需要分號辑畦,在OC中需要;
- 在Swift中腿倚,若多個語句并列纯出,之間要加分號;例如
let a = 100; let b = 200
- 在Swift中,
() 代表構(gòu)造函數(shù)
潦刃,創(chuàng)建并初始化對象侮措,相當(dāng)于OC中 alloc init
; - 在Swift中乖杠,寫括號時分扎,
先只寫一個左括號,會有代碼提示
胧洒; - 在Swift中畏吓,獲取系統(tǒng)顏色:
UIColor.red
相當(dāng)于OC中[UIColor redColor]; - 在Swift中,
可以省略 self. 也可以加上卫漫,個人建議不要加上
菲饼,在閉包中必須加上 self. - 在Swift中,print函數(shù)相當(dāng)于OC中NSLog函數(shù)列赎,其執(zhí)行效率更高宏悦;
- 在Swift中,按鈕添加監(jiān)聽方法包吝,
#selector(方法名())
饼煞,如果有參數(shù)需添加冒號#selector(方法名(參數(shù):))
常量與變量
- 常量,一旦定義初始化了诗越,就不能再修改砖瞧,用關(guān)鍵字
let
修飾,否則會報(bào)錯Immutable value 'x' may only be initialized once
嚷狞; - 常量的值不要求在編譯期確定块促,但
使用之前必須賦值一次
; - 變量床未,定義初始化了竭翠,可以多次修改,用關(guān)鍵字
var
修飾薇搁; -
常量與變量在初始化之前逃片,是不能使用的,如果使用會報(bào)錯
只酥;
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//定義常量
let x = 20
//x = 80
//定義變量
var y = 40
y = 50
print(x+y)
//view1初始化
let view1 = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
view1.backgroundColor = UIColor.green
view.addSubview(view1)
}
}
- 控件view1初始化之后用let修飾,后面修改了其屬性呀狼,并沒有修改指針的地址裂允,即view1始終指向UIView的實(shí)例對象,所以可以用常量let修飾哥艇;
類型的自動推導(dǎo)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let x = 20
let y = 3.5
let r1 = x + Int(y)
let r2 = Double(x) + y
let r3 = x + y
}
}
- 發(fā)現(xiàn) let r3 = x + y這行代碼報(bào)錯绝编;
-
按住option鍵,再左點(diǎn)擊x
,發(fā)現(xiàn)常量x的類型為Int十饥,我們并沒有聲明常量x的類型窟勃,但它的類型已經(jīng)被確定為Int整型,是因?yàn)镾wift語言的中自動推導(dǎo)逗堵,會根據(jù)設(shè)置數(shù)值的右側(cè)代碼秉氧,推斷出常量/變量的數(shù)據(jù)類型
; -
在Swift中任何兩個不同類型的變量或者常量蜒秤,是不允許直接計(jì)算
汁咏,這就是為什么let r3 = x + y報(bào)錯的原因,要想計(jì)算必須進(jìn)行數(shù)值類型的轉(zhuǎn)換作媚,轉(zhuǎn)成同一種類型攘滩,才能進(jìn)行計(jì)算; - let r3 = x + y這行代碼報(bào)錯也證明:
在Swift中纸泡,在任何時候漂问,變量或者常量都不會做隱式轉(zhuǎn)換
; - Swift是一個對
數(shù)據(jù)類型要求異常嚴(yán)格
的語言女揭; - Int --> 64位整數(shù) 相當(dāng)于OC中 long蚤假;
- Double --> 雙精度的小數(shù),相當(dāng)于OC中 CGFloat田绑;
初識可選項(xiàng)Optional
- 可選項(xiàng):表示一個變量可以為
本身類型
勤哗,也可以為nil
; - 定義一個常量或者變量掩驱,如果需要指定其類型芒划,可使用
常量/變量 : 類型
的方式指定其準(zhǔn)確的類型; - 可選項(xiàng) 使用
?
進(jìn)行定義欧穴; - 可選項(xiàng)Optional可視為一種數(shù)據(jù)類型民逼;
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let x : Double = 20
print(x)
var y : Int?
print(y)
y = 30
print(y)
}
}
- let x : Double = 20:指定了常量x的類型為Double;
- var y : Int? :定義變量y為可選項(xiàng)類型涮帘,那么變量y可以是一個整數(shù)拼苍,也可以是nil,在
未初始化時默認(rèn)情況下是nil
调缨; - y = 30:對變量y進(jìn)行賦值疮鲫,可選項(xiàng)在輸出的時候,會提示
Optional
弦叶,調(diào)試結(jié)果如下:
Snip20210424_24.png
- 使用可選項(xiàng)的變量俊犯,
其值可能有兩種類型,一種是本身類型伤哺,另一種是nil
燕侠,所以在Swift中可選項(xiàng)是不能直接參與運(yùn)算的
者祖; -
!
感嘆號 --> 在Swift中表示強(qiáng)行解包(unwrapping)
,進(jìn)行解包操作時一定要保證可選項(xiàng)變量有值绢彤,才能解包成功七问,否則就會出現(xiàn)崩潰
;
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
x = 30
print(x!+20)
}
}
- var x : Int?:x為可選項(xiàng)茫舶,然后初始化為30械巡;
- x! 強(qiáng)制解包,獲取x的值奇适,然后參與運(yùn)算坟比;
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
}
}
- var x : Int? :定義了一個可選項(xiàng)變量x,出現(xiàn)警告
Variable 'x' was never used; consider replacing with '_' or removing it
嚷往,是說x沒有被使用葛账,建議直接移除,現(xiàn)做如下修改:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
x = 30
}
}
- 可選項(xiàng)變量x 對其初始化為30皮仁,依然出現(xiàn)警告
Variable 'x' was written to, but never read
表示 x 只做了寫的操作籍琳,沒有進(jìn)行讀取操作,再作修改如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
x = 30
print(x)
}
}
- 可選項(xiàng)變量x 定義且初始化后贷祈,再讀取打印其值趋急,還是出現(xiàn)警告
Expression implicitly coerced from 'Int?' to 'Any'
解決方案:在使用x值的時候使用強(qiáng)制解包
,修改如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
x = 30
print(x!)
}
}
- 這樣就完美了势誊,沒有任何警告呜达,再看一種情況如下:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : Int?
print(x!)
}
}
- 運(yùn)行直接崩潰,報(bào)錯
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
- 上面已經(jīng)提到可選項(xiàng)變量
強(qiáng)行解包(unwrapping)
表明可選項(xiàng)修飾的變量一定有值粟耻,如果沒有查近,就會出現(xiàn)崩潰,這里的x沒有初始化其值默認(rèn)為nil挤忙,所以出現(xiàn)崩潰霜威; - 所以可選項(xiàng)變量在使用!強(qiáng)行解包的時候册烈,要確保變量一定有值戈泼,下面來看一段代碼:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let x : Int?
if x != nil {
print(x!)
}
}
}
- if x != nil 執(zhí)行會報(bào)錯,提示
Constant 'x' used before being initialized
赏僧,表明可選項(xiàng)常量x在使用之前必須要初始化大猛,否則會報(bào)錯
; - 若將let 改成var淀零,就不會報(bào)錯了胎署,這是因?yàn)?code>可選項(xiàng)變量在定義的時候若沒有初始化,會默認(rèn)初始化為nil窑滞;
總結(jié):
-
var的可選項(xiàng)默認(rèn)值是nil
; -
let的可選項(xiàng)是沒有默認(rèn)值的,必須要初始化值哀卫,否則訪問會報(bào)錯
巨坊; - 無論var還是let,在使用之前必須初始化此改,否則直接使用就會崩潰趾撵;
?? 操作符
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var x : String?
x = "liyanyan"
if x != nil {
print(x! + "好")
}
print((x ?? "空的") + "也好")
}
}
-
??
操作符:表示判斷變量是否為nil星爪,若為nil湃密,則使用后面的字符進(jìn)行替換; - 上面代碼的執(zhí)行結(jié)果為:
liyanyan好 liyanyan也好
丑慎; - 若將
x = "liyanyan"
移除移剪,執(zhí)行結(jié)果為空的也好
究珊;
標(biāo)識符
- 標(biāo)識符(比如常量名,變量名纵苛,函數(shù)名)幾乎可以使用任何字符剿涮;
- 標(biāo)識符不能以數(shù)字開頭,不能包含空白字符攻人,制表符取试,箭頭等特殊字符;
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//: # 一級標(biāo)題
??()
let ?? = "hehe"
print(??)
var ?? = "like"
print(??)
}
func ??() {
print("haha")
}
}
常見的數(shù)據(jù)類型
-
值類型
:-
枚舉(enum)
:可選項(xiàng)Optional -
結(jié)構(gòu)體(struct)
:Bool怀吻,Int瞬浓,F(xiàn)loat,Double蓬坡,Character猿棉,String,Array渣窜,Dictionary铺根,Set
-
-
引用類型
:類(class)
-
整數(shù)類型
:Int8,Int16乔宿,Int32位迂,Int64,UInt8详瑞,UInt16掂林,UInt32,UInt64- Int8:占8位一個字節(jié)坝橡;
- UInt8: 無符號占8位一個字節(jié)泻帮;
- 在32位平臺,Int等價于Int32计寇;在64位平臺锣杂,Int等價于Int64脂倦;
- 整數(shù)的最值:UInt8.max,Int16.min
- 一般情況下元莫,都是直接使用Int赖阻;
浮點(diǎn)類型
:Float是32位的,精度只有6位踱蠢;Double是64位的火欧,精度至少15位;
字面量
- 布爾:let bool = true
- 字符串:let str = "liyanyan"
- 字符:let char : Character = "1"茎截;必須指明其類型位 為Character苇侵,否則默認(rèn)為字符串;
- 整數(shù):
- 十進(jìn)制:let a = 17
- 二進(jìn)制:let b = 0b0001
- 八進(jìn)制:let c = 0o21
- 十六進(jìn)制:let d = 0x11
- 浮點(diǎn)數(shù):
- 十進(jìn)制:let a = 125.0企锌,等價于1.25e2榆浓;
- 十六進(jìn)制 let b = 0xFp2,等價于15*2^2 = 60.0霎俩;p是特殊字符表示冪運(yùn)算哀军;
- 十六進(jìn)制 let b = 0xFp-2,等價于15*2^-2 = 3.75打却;F是十六進(jìn)制等于15杉适;
- 整數(shù)和浮點(diǎn)數(shù)可以添加額外的零或者下劃線來增強(qiáng)可讀性;
- 100_0000 :表示100萬
- 數(shù)組:let arr = [1,2,3]
- 字典:let dic = ["age":13柳击,"name":"liyanyan"]
類型轉(zhuǎn)換
- 整數(shù)轉(zhuǎn)換
let int1:UInt16 = 2_000
let int2:UInt8 = 1
//將int2 -- 轉(zhuǎn)成UInt16 同種類型才能運(yùn)算
let int3 = int1 + UInt16(int2)
- 整數(shù)猿推,浮點(diǎn)數(shù)轉(zhuǎn)換
let int = 10
let double = 0.1234
let p = Double(int) + double
- 字面量是可以直接運(yùn)算的,因?yàn)樽置媪勘旧頉]有明確的類型
let result = 3 + 0.1234
元組(tuple)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let error = (404,"Not Found")
print(error.0)
print(error.1)
let (statuCode,StatuMsg) = error
print(statuCode)
let (statuCode1,_) = error
print(statuCode1)
let error1 = (statuCode:200,desc:"OK")
print(error1.statuCode)
print(error1.desc)
}
}
-
let error = (404,"Not Found")
:是一個元組捌肴,內(nèi)部包含兩種數(shù)據(jù)類型蹬叭,整型與字符串,內(nèi)部元素可通過下標(biāo)進(jìn)行訪問状知; -
let (statuCode,StatuMsg) = error
:元組之間可以賦值 -
let (statuCode1,_) = error
:元組之間可以賦值秽五,對于不需要的數(shù)據(jù)項(xiàng)可以使用_
進(jìn)行忽略; -
let error1 = (statuCode:200,desc:"OK")
:元組內(nèi)部元素的前面可添加參數(shù)饥悴,以后訪問可以通過參數(shù)進(jìn)行訪問坦喘;
關(guān)于自增運(yùn)算
- 在swift3中去除了自增,自減運(yùn)算西设;