鞏固—Swift 5.0 基礎(chǔ)知識(一)

元組

  • 定義: 可以將多個(gè)不同類型的值合成單個(gè)復(fù)合值桥爽。(可以是任意類型的)
  • 使用:
    • 可以將內(nèi)容分為常量或變量進(jìn)行常規(guī)訪問:

       let https = (404,"Not Found") 
       let (statusCode, statusMessage) = https
       print("The status code is \(statusCode)") //輸出:The status code is 404
      
    • 如只需某些元組的值,可以用“_”來忽略元組的部分值

       let (value , _ ) = https
       print("The status code is \(value)") //輸出:The status code is 404
      
    • 使用從0開始索引訪問元組各個(gè)元素值或給元組各個(gè)元素命名來訪問

        let examples = (a:200,b:"OK")
        print("The value is \(examples.0)") //輸出:The value is 200
        print("The value is \(examples.a)") //輸出:The value is 200
      
    • 適用:

      • 作為函數(shù)的返回值特別有用
      • 互換值:(a,b)= (b,a) 等

可選類型

  • 定義:可能不存在值的數(shù)據(jù)類型底洗。兩種可能:要么是有一個(gè)值踩蔚,你可以解開可選的訪問值,或者是沒有價(jià)值可言,為nil隙姿。
    • 注意: Object-C和swift中的nil不同:OC中是一個(gè)指向不存在對象的指針,只適用于對象(引用)類型厂捞,不適用與值類型输玷。swift中nil不是一個(gè)指針,它是沒有某種類型的值靡馁,任何類型的可選項(xiàng)都可以設(shè)置為nil欲鹏,而不僅僅是對象類型。
  • 使用:
    • 如果你的代碼中的常量或者變量在某些情況下缺少值時(shí)使用臭墨,則始終將其聲明為適當(dāng)類型的可選值赔嚎。(可選類型默認(rèn)值:nil)

    • 一般展開可選類型的寫法

        if 可選類型名 != nil {
            print("It must have a value \(可選類型名!) ")
        } 
      
    • 安全展開可選類型的寫法(可選綁定:來確定可選項(xiàng)是否包含值,如果是,則將值用作臨時(shí)常量或變量尤误。否則走else)

        if let newValue = 可選類型名 {
            print("It must have a value \(newValue) ")
        } 
        重點(diǎn):可以包含多個(gè)(let newValue = 可選類型名),中間用“,”隔開侠畔,只要其中一個(gè)為nil則整個(gè)表達(dá)式都為否。
      
    • 可以使用感嘆號來訪問其基礎(chǔ)值(注:一旦使用袄膏!訪問践图,必須保證一定存在值,否則將error)

    • ??:進(jìn)行解包沉馆,如果包含值則返回本身码党,否則返回默認(rèn)值。a ?? b <==> a != nil ? a! : b

  • 隱式解析可選類型
    • 定義后綴!作為標(biāo)準(zhǔn)庫中命名類型Optional<Wrapped>的語法糖斥黑,來實(shí)現(xiàn)自動解包的功能

        var implicitlyUnwrappedString: String!
        var explicitlyUnwrappedString: Optional<String>
      
    • 注意:由于隱式解包修改了包含器類型的聲明語義揖盘,嵌套在元組類型或泛型的可選類型(比如字典元素類型或數(shù)組元素類型),不能被標(biāo)記為隱式解包锌奴。

        let tupleOfImplicitlyUnwrappedElements: (Int!, Int!)  // 錯(cuò)誤
        let implicitlyUnwrappedTuple: (Int, Int)!             // 正確
        
        let arrayOfImplicitlyUnwrappedElements: [Int!]        // 錯(cuò)誤
        let implicitlyUnwrappedArray: [Int]!                  // 正確
      

元類型

  • 定義: 元類型是指類型的類型兽狭,包括類類型、結(jié)構(gòu)體類型鹿蜀、枚舉類型和協(xié)議類型箕慧。
  • 獲取元類型:類、結(jié)構(gòu)體或枚舉類型的元類型是相應(yīng)的類型名緊跟.Type茴恰。協(xié)議類型的元類型——并不是運(yùn)行時(shí)符合該協(xié)議的具體類型——而是該協(xié)議名字緊跟.Protocol颠焦。比如,類SomeClass的元類型就是SomeClass.Type往枣,協(xié)議SomeProtocol的元類型就是SomeProtocal.Protocol伐庭。
  • 類型名.self來獲取類型。也可以使用type(of:)來獲取該實(shí)例在運(yùn)行期的類型分冈。

使用goard的正確姿勢

  • 可以用goard:在驗(yàn)證入口條件時(shí)

      func refreshData() {
          let session = Int("12")
          goard let value = session else {reture}
          print("\(session!)")
      } 
      好處:
          1.一眼看出圾另,這個(gè)條件檢查并不是函數(shù)本身的功用,而是函數(shù)執(zhí)行的先決條件雕沉。
          2.如果有人不小心將提前退出的語句從 else 表達(dá)式中移除了集乔,編譯器會及時(shí)告訴你這個(gè)錯(cuò)誤。
    
  • 使用場景:方法中存在非常長的執(zhí)行路徑坡椒,在最終結(jié)果得到之前扰路,中間會有多個(gè)需要被滿足的條件,這些條件都應(yīng)該為真肠牲,否則應(yīng)該直接 return 或者拋出異常幼衰。(這些條件可以用guard拋出)

  • 可以用 guard:在可選值解包時(shí)(拍扁 if let..else 金字塔):使用 guard 的方式來解包可選值是非常推薦的。if let 的方式需要在大括號內(nèi)使用解包之后的值缀雳,而 guard 語句將解包之后的值添加到了之后的作用域之中——所以你可以在使用 guard 解包之后直接使用它渡嚣,不用包裹在大括號內(nèi)。

       guard let id = json["id"] as? Int,
        let name = json["name"] as? String,
        let userId = json["user_id"] as? Int,
        let position = json["pos"] as? Double
      else {
          throw ParsingError.MissingData
      }
      return Task(id: id, name: name, userId: userId, position: position)
    

錯(cuò)誤處理

  • 可以使用值得存在或不存在來傳達(dá)函數(shù)的成功或失敗,錯(cuò)誤處理允許您確定故障的根本原因识椰,如有必要绝葡,將錯(cuò)誤傳播到程序的一部分。

      如:throws關(guān)鍵字來引發(fā)錯(cuò)誤
      func canThrowAnError() throws {
          
      }
      使用:當(dāng)調(diào)用此函數(shù)時(shí)腹鹉,需要使用如下方式藏畅,并加上try關(guān)鍵字,catch可以是多個(gè)
      do {
          try canThrowAnError()
      } catch {
      
      }
    

斷言和前提條件

  • 定義:斷言和前提條件是在運(yùn)行時(shí)發(fā)生的檢查功咒。在執(zhí)行任何其他代碼之前愉阎,您可以使用它們確保滿足基本條件。如果斷言或前提條件中的布爾條件評估為true力奋,則代碼執(zhí)行情況依然如常榜旦。如果條件求值false,程序的當(dāng)前狀態(tài)無效; 代碼執(zhí)行結(jié)束景殷,您的應(yīng)用程序已終止
  • 使用:
    • assert(age >= 0, "A person's age can't be less than zero."): 當(dāng)條件為false就會拋出error錯(cuò)誤信息溅呢,
    • precondition(index > 0, "Index must be greater than zero.") :同上
    • assertionFailure("A person's age can't be less than zero."):當(dāng)已經(jīng)檢查了某條件時(shí),可以直接吃用此方法拋出錯(cuò)誤
    • preconditionFailure("A person's age can't be less than zero."):同上

基本運(yùn)算符

  • a...b :全封閉區(qū)間猿挚,相當(dāng)于[a,b]咐旧;

  • a..<b: 半開半閉區(qū)間,相當(dāng)于[a,b)绩蜻;

  • 單面范圍: [a...]铣墨,[...b],[..<b],

      for name in names[2...] { //從下標(biāo)2開始到最后
          print(name)
      }
      for name in names[...2] { //從下標(biāo)0到下標(biāo)2的所有元素
          print(name)
      }
    

字符串與字符

  • 如果需要一個(gè)跨多行的字符串,請使用多行字符串文字 - 由三個(gè)雙引號包圍的一系列字符辜羊。

      如:let example = """
      The first row 
      
      The sencond Row 
      ...
      """
    
  • 使用”+“來拼接兩個(gè)字符串踏兜。

      //實(shí)例
      let badStart = """
      one
      two
      """
      let end = """
      three
      """
      print(badStart + end)
      // Prints two lines:
      // one
      // twothree
       
      let goodStart = """
      one
      two
       
      """
      print(goodStart + end)
      // Prints three lines:
      // one
      // two
      // three
    
  • 可以使用”()“進(jìn)行插入值词顾。

  • 使用index(before:)and index(after:)方法訪問給定索引之前和之后的索引String八秃。要訪問遠(yuǎn)離給定索引的索引,您可以使用該index(_:offsetBy:)方法肉盹,而不是多次調(diào)用其中一個(gè)方法昔驱。

      let greeting = "Guten Tag!"
      greeting[greeting.startIndex]
      // G
      greeting[greeting.index(before: greeting.endIndex)]
      // !
      greeting[greeting.index(after: greeting.startIndex)]
      // u
      let index = greeting.index(greeting.startIndex, offsetBy: 7)
      greeting[index]
      // a
      注意:endIndex是最后一個(gè)字符的下一個(gè)字符的索引,greeting[greeting.endIndex] // Error
    
  • 使用該indices屬性訪問字符串中單個(gè)字符的所有索引上忍。

      for index in greeting.indices {
          print("\(greeting[index]) ", terminator: "")
      }
      // Prints "G u t e n   T a g ! "
      注意: terminator:關(guān)鍵字表示不換行骤肛。
    
  • 插入和刪除(都是索引值,切記不是整數(shù)):

    • 要將單個(gè)字符插入到指定索引的字符串中窍蓝,請使用該insert(_:at:)方法腋颠,并在指定的索引處插入另一個(gè)字符串的內(nèi)容,然后使用該insert(contentsOf:at:)方法吓笙。
    • 要從指定索引的字符串中刪除單個(gè)字符淑玫,請使用該remove(at:)方法,并刪除指定范圍內(nèi)的子字符串,請使用以下removeSubrange(_:)方法:
  • 比較字符串: ”==“絮蒿,(Swift中的字符串和字符比較不區(qū)分大小寫尊搬。)

  • 前綴和后綴:要檢查字符串是否具有特定的字符串前綴或后綴,請調(diào)用字符串hasPrefix("字符串")和 hasSuffix("字符串")方法

  • UTF-8土涝、UTF-16和Unicode表示字符串

      for codeUnit in dogString.utf8 {
          print("\(codeUnit) ", terminator: "")
      }
      print("")
      // Prints "68 111 103 226 128 188 240 159 144 182 "
      
      for codeUnit in dogString.utf16 {
          print("\(codeUnit) ", terminator: "")
      }
      print("")
      // Prints "68 111 103 8252 55357 56374 "
      
      for scalar in dogString.unicodeScalars {
          print("\(scalar.value) ", terminator: "")
      }
      print("")
      // Prints "68 111 103 8252 128054 "
      for scalar in dogString.unicodeScalars {
          print("\(scalar) ", terminator: "")
      }
      //Prints "D o g !! "
    

集合類型

  • 數(shù)組遍歷:
    定義:

      var someInts = [Int]()
      var threeDoubles = Array(repeating: 0.0, count: 3)
      // threeDoubles is of type [Double], and equals [0.0, 0.0, 0.0]
      var shoppingList: [String] = ["Eggs", "Milk"]
      
      for (index, value) in shoppingList.enumerated() {
          print("Item \(index + 1): \(value)")
      }
      // Item 1: Six eggs
      // Item 2: Milk
      // Item 3: Flour
      // Item 4: Baking Powder
      // Item 5: Bananas
    
  • 集合:

  • 定義:

      var letters = Set<Character>()
      or
      var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
    
    • 使用該intersection(_:)方法創(chuàng)建一個(gè)僅具有兩個(gè)集合通用值的新集合佛寿。
    • 使用該symmetricDifference(_:)方法創(chuàng)建一個(gè)新集合,其中的值可以是任一集但壮,但不能同時(shí)使用冀泻。
    • 使用該union(_:)方法創(chuàng)建一個(gè)新集合,其中所有值都在兩個(gè)集合中蜡饵。
    • 使用該subtracting(_:)方法創(chuàng)建一個(gè)新集合腔长,其值不在指定的集合中。
    • 使用“等于”運(yùn)算符(==)來確定兩個(gè)集合是否包含所有相同的值验残。
    • 使用該isSubset(of:)方法確定集合的所有值是否包含在指定的集合中捞附。
    • 使用該isSuperset(of:)方法來確定集合是否包含指定集合中的所有值。
    • 使用isStrictSubset(of:)或isStrictSuperset(of:)方法來確定集合是子集還是超集您没,但不等于指定集鸟召。
    • 使用該isDisjoint(with:)方法來確定兩個(gè)集合是否沒有共同的值。
  • 字典:

  • 定義:

      var namesOfIntegers = [Int: String]()
      // namesOfIntegers is an empty [Int: String] dictionary
      var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
    
  • 遍歷

      for (airportCode, airportName) in airports {
          print("\(airportCode): \(airportName)")
      }
      // YYZ: Toronto Pearson
      // LHR: London Heathrow
      
      等價(jià)于下面:
      for airportCode in airports.keys {
          print("Airport code: \(airportCode)")
      }
      // Airport code: YYZ
      // Airport code: LHR
       
      for airportName in airports.values {
          print("Airport name: \(airportName)")
      }
      // Airport name: Toronto Pearson
      // Airport name: London Heathrow
    
  • 新的遍歷方式:

      使用該stride(from:to:by:)功能跳過不需要的標(biāo)記氨鹏。
      let minuteInterval = 5
      for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
          // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
      }
      
      也可以使用閉合范圍stride(from:through:by:):
      let hours = 12
      let hourInterval = 3
      for tickMark in stride(from: 3, through: hours, by: hourInterval) {
          // render the tick mark every 3 hours (3, 6, 9, 12)
      }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欧募,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仆抵,更是在濱河造成了極大的恐慌跟继,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镣丑,死亡現(xiàn)場離奇詭異舔糖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莺匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門金吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趣竣,你說我怎么就攤上這事摇庙。” “怎么了遥缕?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵卫袒,是天一觀的道長。 經(jīng)常有香客問我单匣,道長夕凝,這世上最難降的妖魔是什么烤蜕? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮迹冤,結(jié)果婚禮上讽营,老公的妹妹穿的比我還像新娘。我一直安慰自己泡徙,他們只是感情好橱鹏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堪藐,像睡著了一般莉兰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁竞,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天糖荒,我揣著相機(jī)與錄音,去河邊找鬼模捂。 笑死捶朵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狂男。 我是一名探鬼主播综看,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岖食!你這毒婦竟也來了红碑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤泡垃,失蹤者是張志新(化名)和其女友劉穎析珊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔑穴,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忠寻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澎剥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锡溯。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赶舆,死狀恐怖哑姚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芜茵,我是刑警寧澤叙量,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站九串,受9級特大地震影響绞佩,放射性物質(zhì)發(fā)生泄漏寺鸥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一品山、第九天 我趴在偏房一處隱蔽的房頂上張望胆建。 院中可真熱鬧,春花似錦肘交、人聲如沸笆载。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凉驻。三九已至,卻和暖如春复罐,著一層夾襖步出監(jiān)牢的瞬間涝登,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工效诅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胀滚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓乱投,卻偏偏與公主長得像蛛淋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子篡腌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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