MG--Swift3.x进阶语法学习1

  • for循环的高级遍历

    • 一、遍历子控件而且指定是UILabel的控件才打印


    遍历子控件而且指定是UILabel的控件才打印
    • 二、使用Where关键字查找名字

单个条件

多个条件使用&&
  • 三、遍历中包含可选值

    • 通常写法:打印出来的是可选值
      通常写法
    • 优化写法:使用 case let name? 打印出来的不是可选值
      代替写法
  • nil的用法

  • 如果使用了可选类型,那么是非常危险的,通常就需要通过“!”强制解包,这就会导致程序崩溃(Crash)。Swift提供了一个??的操作符,如果可选类型为nil,会让它默认值

  • eg: 举个
let name: String? = "MG"
let otherName  = name ?? "小明"
print(otherName)
// 打印出来的是  `MG`
let name: String? = nil
let otherName  = name ?? "小明"
print(otherName)
// 打印出来的是  `小明
方法的返回值是可选值.png
  • 一般与关键字try连用

- #####使用do  try catch

- #####使用try? 可以简化成这样


58D6345E-7927-492F-AF2C-C044796577CC.png

- #####Optional binding(可选绑定)

if let unwrappedAuthorName = authorName {
         print("Author is \(unwrappedAuthorName)")
} else {
         print("No author.")
}

  • Lazy Loading

    • eg:举个
    • 普通

class Person {
    let name: String
    init(name: String) {
        self.name = name
    }
    func reversedName() -> String {  // 字符串反转方法
        return "\(name.uppercased()) backwords is \(String(name.uppercased().characters.reversed()))"
    }
}
let person = Person(name: "ming Swift")
print(person.reversedName())
>  - #Lazy
class Person {
    let name: String
    lazy var reversedName: String = self.getReversedName()
    init(name: String) {
        self.name = name
    }
    private func getReversedName() -> String { // 字符串反转方法
        return "\(name.uppercased()) backwords is \(String(name.uppercased().characters.reversed()))"
    }
}
let person = Person(name: "ming Swift")
print(person.reversedName)

打印出来的字符串是 “MING SWIFT backwords is TFIWS GNIM”


  • goto用法

    • 我们来看普通的方法
var board = [[String]](repeating: [String](repeating: "",
                                           count: 10), count: 10)
board[3][5] = "x"
for (rowIndex, cols) in board.enumerated() {
      for (colIndex, col) in cols.enumerated() {
          if col == "x" {
              print("Found the treasure at row \(rowIndex) col \(colIndex)!")
          }
      }
}

解释:虽然打印出来我们想要的结果,但是这段代码做了很多无用功。如果一开始搜索的找到的时候就使用break跳出循环。往下看看:

var board = [[String]](repeating: [String](repeating: "",
                                           count: 10), count: 10)
board[3][5] = "x"
for (rowIndex, cols) in board.enumerated() {
      for (colIndex, col) in cols.enumerated() {
          if col == "x" {
              print("Found the treasure at row \(rowIndex) col \(colIndex)!")
              break
          }
      }
}

解释:然而,使用break也只是结束了当前的循环,so it would exit the for (colIndex, col) loop then continue running the for (rowIndex, cols) loop.(for (colIndex, col)这个循环直到跑完for (rowIndex, cols) 循环才会退出),这也浪费了一些时间。我们继续往下看更优化的代码:

var board = [[String]](repeating: [String](repeating: "",
                                           count: 10), count: 10)
board[3][5] = "x"
rowLoop: for (rowIndex, cols) in board.enumerated() {
      for (colIndex, col) in cols.enumerated() {
          if col == "x" {
              print("Found the treasure at row \(rowIndex) col \(colIndex)!")
              break rowLoop
          }
      }
}

解释:标记你的循环。这会立即跳出循环,和结束后for (rowIndex, cols)循环——完美。

  • 再举个

-  未优化代码,层层嵌套
if userRequestedPrint() {
        if documentSaved() {
          if userAuthenticated() {
              if connectToNetwork() {
                  if uploadDocument("resignation.doc") {
                      if printDocument() {
                          print("Printed successfully!")
                      }
                  }
               }
           }
         }
  }
- 优化后的代码:使用Guard之后,层级会变得非常清晰,这样的代码可读性非常强
printing: if userRequestedPrint() {
          guard documentSaved() else { break printing }
          guard userAuthenticated() else { break printing }
          guard connectToNetwork() else { break printing }
          guard uploadDocument("work.doc") else { break printing }
          guard printDocument() else { break printing }
          print("Printed successfully!")
}



  • enum枚举和Struct结构体

    • eg:伦敦这个地方,有叫地理位置。有地铁路线以及旅游景点。其中一个常量:地理位置,两个嵌套的枚举:地铁路线以及旅游景点是一个枚举。

enum London {  
        static let coordinates = (lat: 51.507222, long: -0.1275) // 地理位置(经纬度)
        enum SubwayLines {  // 地铁路线
            case Bakerloo, Central, Circle, District, Elizabeth,HammersmithCity, Jubilee, Metropolitan, Northern, Piccadilly,
Victoria, WaterlooCity
        }
        enum Places {   // 位置
            case BuckinghamPalace, CityHall, OldBailey, Piccadilly,StPaulsCathedral
        }
 }
  • 举个 枚举

 enum R {
       enum Storyboards: String {
           case Main, Detail, Upgrade, Share, Help
       }
       enum Images: String {
           case Welcome, Home, About, Button
       } 
}
// 外界使用:现在流行的SnapKit,MJRefresh等度有自己的前缀开头也许就是这样搞的
let home = R.Images.Home // 这样层级也很清晰
  • 举个 枚举和结构体

struct Deck {
        struct Card {
            enum Suit {
                case Hearts, Diamonds, Clubs, Spades
            }
            var rank: Int
            var suit: Suit
        }
        var cards = [Card]()
}
// 外界使用:现在流行的SnapKit,MJRefresh等度有自己的前缀开头也许就是这样搞的
let hearts = Deck.Card.Suit.Hearts // 这样层级也很清晰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容