Swift學習筆記(一)-- 變量睁壁、元組潘明、可選類型秕噪、

1 變量和常量

  • 常量&變量的使用原則:
    為保證數(shù)據(jù)的安全性盡量先用 let,只有需要改變的時候才使用 var

 let 常量: 常量的值一旦設定就不能改變
 var 變量: 變量的值可以隨意更改
  • 定義常量的格式:
聲明符號 常量名稱: 類型標注
let number: Int // 特點: 一旦設定就不能改變

 let number: Int = 10
 number = 20 //不可修改常量的值
  • 定義變量格式:
 *聲明符號 變量名稱: 類型標注
 var number: Int
 *特點: 變量的值可以隨意更改
 *注意: 一般來說你很少需要寫類型標注遂填。如果你在聲明常量或者變量的時候賦了一個初始值吓坚,Swift可以推斷出這個常量或者變量的類型
 var number: Int = 10
 number = 20 //可修改變量的值
  • 類型推斷
    編譯器可以在編譯代碼的時候自動推斷出表達式的類型。(其它語言是沒有類型推斷)椎镣,原理很簡單,只要檢查你賦的值即可碎绎。如果沒有指定表達式的類型, 也沒有賦予初始值, 編譯器會報錯(type annotation missing in pattern)脱羡。
let number1 = 10
var number2 = 20.1
// 注意點: 如果沒有指定表達式的類型, 也沒有賦予初始值, 編譯器會報錯
  • 類型安全
    Swift 是一個類型安全(type safe)的語言, 它會在編譯你的代碼時進行類型檢查(type checks)秧均,并把不匹配的類型標記為錯誤。
let number: Int = 10.1 //類型不匹配

這可以讓你在開發(fā)的時候盡早發(fā)現(xiàn)并修復錯誤锯七。swift 對數(shù)據(jù)類型要求異常嚴格, swift 中任何時候誉己,都不會做 隱式轉換巨双,如果要對不同類型的數(shù)據(jù)進行計算,必須顯示類型轉換袱蜡。

let number1 = 10
let number2 = 10.1
// let sum = number7 + number8 //類型不匹配慢宗,無法進行計算
// 必須進行類型轉換
let sum = let sum = Double(number1) + number2
let sum1 = number1 + Int(number2)

注意:

  • 結合數(shù)字類常量和變量不同于結合數(shù)字類字面量婆廊。字面量8可以直接和字面量3.1415926相加,因為數(shù)字字面量本身沒有明確的類型茵典。它們的類型只在編譯器需要求值的時候被推測统阿。
// 字面量之間運算可以是不同類型
let sum2 = 10 + 10.1
  • Double和CGFloat也需要轉換
let point = CGPoint(x: 10.10, y: 20.20)
let temp = point.x
let sum = double(point.x) + temp
  • 常量和變量的命名
    • 你可以用任何你喜歡的字符作為常量和變量名,包括 Unicode 字符
let ?? = "狗"
let 你好 = “你好世界”
  • 常量與變量名不能包含數(shù)學符號帆离,箭頭结澄,保留的(或者非法的)Unicode 碼位麻献,連線與制表符
  • 也不能以數(shù)字開頭,但是可以在常量與變量名的其他地方包含數(shù)字
  • 如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變量名监婶,你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用齿桃。
let `Int` = 10
// 無論如何短纵,你應當避免使用關鍵字作為常量或變量名,除非你別無選擇刮刑。

2 元組(tuples)

元組(tuples)把多個值組合成一個復合值养渴,將多個相同或者不同類型的值用一個小括號括起來就是一個元祖理卑,元組內(nèi)的值可以是任意類型蔽氨,并不要求是相同類型,作為函數(shù)返回值時鹉究,元組非常有用宇立。

let http404Error = (404, "Not Found")

元組的訪問:

  • 你可以分解表的內(nèi)容到單獨的常量或變量,你再像往常一樣訪問:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// Prints "The status code is 404"
print("The status message is \(statusMessage)")
// Prints "The status message is Not Found"
  • 使用從零開始索引號訪問元組的各個元素值:
print("The status code is \(http404Error.0)")
// Prints "The status code is 404"
print("The status message is \(http404Error.1)")
// Prints "The status message is Not Found"
  • 你還可以制定元素名稱去命名并且訪問一個元組:
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// Prints "The status code is 200"
print("The status message is \(http200Status.description)")
// Prints "The status message is OK"

3 可選類型(Optionals)

可選類型表示變量可以有值, 也可以沒有值自赔。C 和 Objective-C 中并沒有可選類型這個概念妈嘹。

  • 格式: Optional<類型> 或 在類型后面加上?號。由于可選類型在Swift中隨處可見, 所以系統(tǒng)做了一個語法糖, 在類型后面加上?
var number: Optional<Int>
number = 10
var serverResponseCode: Int? = 404
  • 可選類型的取值是一個枚舉(None 沒有值 Some 有值)绍妨。Swift中只有可選類型才可以賦值為nil润脸。
var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value
  • 如果你聲明一個可選常量或者變量但是沒有賦值柬脸,它們會自動被設置為nil
var surveyAnswer: String?
// surveyAnswer is automatically set to nil

注意:
nil不能用于非可選的常量和變量倒堕。如果你的代碼中有常量或者變量需要處理值缺失的情況,請把它們聲明成對應的可選類型爆价。
Swift 的nil和 Objective-C 中的nil并不一樣垦巴。在 Objective-C 中,nil是一個指向不存在對象的指針, 所以Objective-C只有對象類型才能被設置為nil(基本類型不行)铭段。在 Swift 中魂那,nil不是指針——它是一個確定的值,用來表示值缺失稠项。任何類型的可選狀態(tài)都可以被設置為nil涯雅,不只是對象類型。

解包:
  • 強制解析(forced unwrapping)
    Swift中可選類型的值不能當做普通類型的值來使用,如果想使用可選類型的值必須進行解包操作展运。只需要在變量/常量后面加上! 就可以解包活逆,解包代表著告訴系統(tǒng), 該變量/常量中一定有值。
var serverResponseCode: Int?
serverResponseCode = 404
print (serverResponseCode!)

注意:
1.init? 構造函數(shù),?表示不一定能夠?qū)嵗鰧ο?
2.!表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接崩潰
3.在Swift開發(fā)中, 盡量不要使用強制解包, 不安全

  • 可選綁定(optional binding)
    不需要考慮url是否有值, 能進入{}一定有值拗胜;不僅可以用來判斷可選類型中是否有值蔗候,同時可以將可選類型中的值賦給一個常量或者變量, 可選綁定可以用在ifwhile語句中。
let url = NSURL(string: "http://www.baidu.com")
if let temp = url {
    // code...
    // temp的作用域只在這個"{}"里面
}
if let firstNumber = Int("4"), secondNumber = Int("42") where firstNumber < secondNumber {
    print("\(firstNumber) < \(secondNumber)")
}

注意:
if語句中的變量/常量(temp)的作用域為{}中埂软。

  • guard
    guard語句是在Swift 2.0中引進的锈遥,它是用途是在未滿足某個條件時,提供一個退出的路徑勘畔。
func test(){
    let value1: Int? = 10
    let value2: Int? = 20
    let value3: Int? = 30
    let value4: Int? = 40
    
    guard let temp1 = value1 else{
        return
    }
    guard let temp2 = value2 else{
        return
    }
    guard let temp3 = value3 else{
        return
    }
    guard let temp4 = value4 else{
        return
    }
    let sum = temp1 + temp2 + temp3 + temp4
    print(sum)
}
test()
// prints 100

注意:
guard中的變量/常量 可以在guard后面使用(作用域);
guard一般用于避免使用強制拆包, 優(yōu)化代碼結構

  • 隱式解析可選類型(implicitly unwrapped optionals)
    有時候在程序架構中所灸,第一次被賦值之后,可以確定一個可選類型總會有值炫七。在這種情況下爬立,每次都要判斷和解析可選值是非常低效的,因為可以確定它總會有值万哪。 隱式解析可選類型, 并不需要每次都使用解析來獲取可選值, 一個隱式解析可選類型其實就是一個普通類型侠驯,但是可以被當做非可選類型來使用。
let FshButton: UIButton!

注意:
如果一個變量之后可能變成nil的話請不要使用隱式解析可選類型奕巍。如果你需要在變量的生命周期中判斷是否是nil的話吟策,請使用普通可選類型。

var doubleValue: Double!
doubleValue = 3.14
doubleValue = nil
print(doubleValue)

報錯原因是編譯器檢測到隱式解析可選類型在賦值為nil的止。

總結一下:

//可選類型(強制解包檩坚,不推薦)
let intValue: Int?
intValue = 10
print(intValue)
print(intValue!)

if intValue != nil {
    print(intValue!)
}

// 可選綁定
if let temp = intValue {
    print(temp)
}

//隱式解析可選類型
var doubleValue: Double!
doubleValue = nil
doubleValue = 3.14
print(doubleValue)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子效床,更是在濱河造成了極大的恐慌睹酌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剩檀,死亡現(xiàn)場離奇詭異憋沿,居然都是意外死亡,警方通過查閱死者的電腦和手機沪猴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門辐啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人运嗜,你說我怎么就攤上這事壶辜。” “怎么了担租?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵砸民,是天一觀的道長。 經(jīng)常有香客問我奋救,道長岭参,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任尝艘,我火速辦了婚禮演侯,結果婚禮上,老公的妹妹穿的比我還像新娘背亥。我一直安慰自己秒际,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布狡汉。 她就那樣靜靜地躺著娄徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轴猎。 梳的紋絲不亂的頭發(fā)上嵌莉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音捻脖,去河邊找鬼。 笑死中鼠,一個胖子當著我的面吹牛可婶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播援雇,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼矛渴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起具温,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蚕涤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铣猩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揖铜,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年达皿,在試婚紗的時候發(fā)現(xiàn)自己被綠了天吓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡峦椰,死狀恐怖龄寞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汤功,我是刑警寧澤物邑,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站滔金,受9級特大地震影響色解,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鹦蠕,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一冒签、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钟病,春花似錦萧恕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屹徘,卻和暖如春走趋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噪伊。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工簿煌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鉴吹。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓姨伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豆励。 傳聞我的和親對象是個殘疾皇子夺荒,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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

  • 基礎部分(The Basics) 當推斷浮點數(shù)的類型時,Swift 總是會選擇Double而不是Float。 結合...
    gamper閱讀 1,275評論 0 7
  • 關于 Swift 重要這個文檔所包含的準備信息, 是關于開發(fā)的 API 和技術的技扼。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,283評論 1 27
  • 基本數(shù)據(jù)類型 整數(shù)整數(shù)就是沒有小數(shù)部分的數(shù)字伍玖,如 42 和 -23 。整數(shù)是有符號的(正剿吻、負窍箍、零)或無符號的(正、...
    Gary_Tseng閱讀 527評論 0 0
  • Swift 是一門開發(fā) iOS, macOS, watchOS 和 tvOS 應用的新語言和橙。然而仔燕,如果你有 C 或...
    XLsn0w閱讀 921評論 2 1
  • 柳哲 北大有一群旁聽生,有人稱他們是“偷聽生”魔招、“蹭客”晰搀,也有人稱他們是“北大游學生”、“北大邊緣人”办斑,他們卻更喜...
    柳志儒閱讀 265評論 0 0