代码之家  ›  专栏  ›  技术社区  ›  user965972

期权的快速枚举

  •  7
  • user965972  · 技术社区  · 11 年前

    有更好的方法吗?语法上看起来更好的东西?

    let a : [Any] = [5,"a",6]
    for item in a { 
      if let assumedItem = item as? Int {
         print(assumedItem) 
      } 
    }
    

    类似这样,但语法正确吗?

      for let item in a as? Int { print(item) }
    
    4 回复  |  直到 11 年前
        1
  •  7
  •   Imanou Petit    7 年前

    使用Swift 5,您可以选择以下Playground示例代码之一来解决问题。


    #1.使用 as type-casting pattern

    let array: [Any] = [5, "a", 6]
    
    for case let item as Int in array {
        print(item) // item is of type Int here
    }
    
    /*
     prints:
     5
     6
     */
    

    #2.使用 compactMap(_:) 方法

    let array: [Any] = [5, "a", 6]
    
    for item in array.compactMap({ $0 as? Int }) {
        print(item) // item is of type Int here
    }
    
    /*
     prints:
     5
     6
     */
    

    #3.使用where子句和 is 型铸造模

    let array: [Any] = [5, "a", 6]
    
    for item in array where item is Int {
        print(item) // item conforms to Any protocol here
    }
    
    /*
     prints:
     5
     6
     */
    

    #4.使用 filter(_:​) 方法

    let array: [Any] = [5, "a", 6]
    
    for item in array.filter({ $0 is Int }) {
        print(item) // item conforms to Any protocol here
    }
    
    /*
     prints:
     5
     6
     */
    
        2
  •  6
  •   ABakerSmith    11 年前

    如果您使用的是Swift 2:

    let array: [Any] = [5,"a",6]
    
    for case let item as Int in array {
        print(item)
    }
    
        3
  •  2
  •   vadian    11 年前

    两种解决方案

    let a = [5,"a",6]
    
    a.filter {$0 is Int}.map {print($0)}
    

    for item in a where item is Int {
        print(item)
    }
    

    实际上,数组中根本没有选项

        4
  •  0
  •   hennes    11 年前

    您也可以使用 flatMap 将数组转换为 [Int] .

    let a : [Any] = [5,"a",6]
    for item in a.flatMap({ $0 as? Int }) {
        print(item)
    }