Swift學習筆記(一)-- 變量、元組、可選類型、

1 變量和常量

  • 常量&變量的使用原則:
    為保證數據的安全性盡量先用 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 //類型不匹配

這可以讓你在開發的時候盡早發現并修復錯誤。swift 對數據類型要求異常嚴格, swift 中任何時候,都不會做 隱式轉換,如果要對不同類型的數據進行計算,必須顯示類型轉換。

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

注意:

  • 結合數字類常量和變量不同于結合數字類字面量。字面量8可以直接和字面量3.1415926相加,因為數字字面量本身沒有明確的類型。它們的類型只在編譯器需要求值的時候被推測。
// 字面量之間運算可以是不同類型
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 你好 = “你好世界”
  • 常量與變量名不能包含數學符號,箭頭,保留的(或者非法的)Unicode 碼位,連線與制表符
  • 也不能以數字開頭,但是可以在常量與變量名的其他地方包含數字
  • 如果你需要使用與Swift保留關鍵字相同的名稱作為常量或者變量名,你可以使用反引號(`)將關鍵字包圍的方式將其作為名字使用。
let `Int` = 10
// 無論如何,你應當避免使用關鍵字作為常量或變量名,除非你別無選擇。

2 元組(tuples)

元組(tuples)把多個值組合成一個復合值,將多個相同或者不同類型的值用一個小括號括起來就是一個元祖,元組內的值可以是任意類型,并不要求是相同類型,作為函數返回值時,元組非常有用。

let http404Error = (404, "Not Found")

元組的訪問:

  • 你可以分解表的內容到單獨的常量或變量,你再像往常一樣訪問:
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中隨處可見, 所以系統做了一個語法糖, 在類型后面加上?
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不是指針——它是一個確定的值,用來表示值缺失。任何類型的可選狀態都可以被設置為nil,不只是對象類型。

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

注意:
1.init? 構造函數,?表示不一定能夠實例化出對象;
2.!表示告訴編譯器一定有值, 編譯能夠通過, 如果運行時沒有值就會直接崩潰
3.在Swift開發中, 盡量不要使用強制解包, 不安全

  • 可選綁定(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一般用于避免使用強制拆包, 優化代碼結構

  • 隱式解析可選類型(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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

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