Swift5.x入門01 -- let唯笙,var,初始可選項(xiàng)盒使,數(shù)據(jù)類型崩掘,類型轉(zhuǎn)換,字面量少办,元組

  • 在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)算西设;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓣铣,一起剝皮案震驚了整個濱河市贷揽,隨后出現(xiàn)的幾起案子棠笑,更是在濱河造成了極大的恐慌,老刑警劉巖禽绪,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巨柒,居然都是意外死亡洋满,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事民泵√秃簦” “怎么了憎夷?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵饮焦,是天一觀的道長县踢。 經(jīng)常有香客問我谴返,道長拯爽,這世上最難降的妖魔是什么篮幢? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任狈涮,我火速辦了婚禮晓锻,結(jié)果婚禮上灿里,老公的妹妹穿的比我還像新娘。我一直安慰自己乘客,他們只是感情好匈织,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般纬向。 火紅的嫁衣襯著肌膚如雪担孔。 梳的紋絲不亂的頭發(fā)上拼坎,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音余舶,去河邊找鬼啊鸭。 笑死,一個胖子當(dāng)著我的面吹牛匿值,可吹牛的內(nèi)容都是我干的赠制。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼挟憔,長吁一口氣:“原來是場噩夢啊……” “哼钟些!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绊谭,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤政恍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后达传,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篙耗,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年宪赶,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹤树。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逊朽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曲伊,到底是詐尸還是另有隱情叽讳,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布坟募,位于F島的核電站岛蚤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懈糯。R本人自食惡果不足惜涤妒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赚哗。 院中可真熱鬧她紫,春花似錦、人聲如沸屿储。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽够掠。三九已至民褂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赊堪。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工面殖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哭廉。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓脊僚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親群叶。 傳聞我的和親對象是個殘疾皇子吃挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容