Foundation-Array

初级

  • 索引
    var students = ["Ben", "Ivy", "Jordell", "Maxime"]
     if let i = students.index(of: "Maxime") {
        students[i] = "Max"
    }
  -----------------------------------------------------
  -----------------------------------------------------
    let students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
    if let i = students.index(where: { $0.hasPrefix("A") }) {
         print("\(students[i]) starts with 'A'!")
    }
     // Prints "Abena starts with 'A'!"
  • 遍历
  let numberWords = ["one", "two", "three"]
   for word in numberWords {
         print(word)
    }
   // Prints "one"
    // Prints "two"
   // Prints "three"
   let numbers = [10, 20, 30, 40, 50, 60]
    numbers.forEach { word in
          print(word)
    }
  • 获取最小值方法
   let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
    let lowestHeight = heights.min()

    let hues = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156]
    let leastHue = hues.min { a, b in a.value < b.value }
    print(leastHue)
    // Prints "Optional(("Coral", 16))"
  • 获取最大值
  let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
  let greatestHeight = heights.max()
  • 包含
 let cast = ["Vivien", "Marlon", "Kim", "Karl"]
 print(cast.contains("Marlon"))
 // Prints "true"

 let expenses = [21.37, 55.21, 9.32, 10.18, 388.77, 11.41]
 let hasBigPurchase = expenses.contains { $0 > 100 }
 // 'hasBigPurchase' == true

中级

  • 移除n个元素
 let numbers = [1, 2, 3, 4, 5]
 print(numbers.dropLast(2))// 丢掉后面两个元素
  // Prints "[1, 2, 3]"
 print(numbers.dropLast(10))
  // Prints "[]"
  -----------------------------------------------------
  -----------------------------------------------------
 let numbers = [1, 2, 3, 4, 5]
 print(numbers.dropFirst(2))// 丢掉前面两个元素
 // Prints "[3, 4, 5]"
 print(numbers.dropFirst(10))
 // Prints "[]"
  • 截取元素
 let numbers = [1, 2, 3, 4, 5]
 print(numbers.suffix(2))// 从后面截取两个元素
 // Prints "[4, 5]"
 print(numbers.suffix(10))
 // Prints "[1, 2, 3, 4, 5]"
  -----------------------------------------------------
  -----------------------------------------------------
 let numbers = [10, 20, 30, 40, 50, 60]
  if let i = numbers.index(of: 40) {
       print(numbers.suffix(from: i))// 从i个元素开始截取到最后一个元素
   }
  // Prints "[40, 50, 60]"
  -----------------------------------------------------
  -----------------------------------------------------
  let numbers = [1, 2, 3, 4, 5]
  print(numbers.prefix(2))// 从前面截取2个元素
  // Prints "[1, 2]"
  print(numbers.prefix(10))
  // Prints "[1, 2, 3, 4, 5]"
  -----------------------------------------------------
  -----------------------------------------------------
   let numbers = [10, 20, 30, 40, 50, 60]
  if let i = numbers.index(of: 40) {
        print(numbers.prefix(upTo: i))// 从第一个元素开始截取第i-1个元素
    }
  // Prints "[10, 20, 30]"
  -----------------------------------------------------
  -----------------------------------------------------
  let numbers = [10, 20, 30, 40, 50, 60]
   if let i = numbers.index(of: 40) {
        print(numbers.prefix(through: i))// 从前面开始截取到第i个
     }
  // Prints "[10, 20, 30, 40]"
  • map的用法实例
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercaseString }
 // 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.characters.count }
 // 'letterCounts' == [6, 6, 3, 4]
  • 过滤元素
 let cast = ["Vivien", "Marlon", "Kim", "Karl"]
 let shortNames = cast.filter { $0.characters.count < 5 }
 print(shortNames)
  // Prints "["Kim", "Karl"]"

高级

  • flatMap 和map的区别?
let array = [1,2,3,4]
let lessFourArray1 = array.flatMap { (x) -> Int? in
    return x < 4 ? x : nil
}
let lessFourArray2 = array.map { (x) -> Int? in
    return x < 4 ? x: nil
}
print(lessFourArray1)
print(lessFourArray2)

运行结果:

[1, 2, 3]
[Optional(1), Optional(2), Optional(3), nil]

再看一个例子

  let numbers = [1, 2, 3, 4]
  let mapped = numbers.map { Array(count: $0, repeatedValue: $0) }
    // [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
   let flatMapped = numbers.flatMap { Array(count: $0, repeatedValue: $0) }
///     // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

提示:

实际上s.flatMap(transform)相当于Array(s.map(transform).joined())

总结:

flagMap 会解封可选值,并且会过滤掉空值nil

  • 分割字符串
  let line = "BLANCHE:   I don't want realism. I want magic!"
  print(line.characters.split(whereSeparator: { $0 == " " }) .map(String.init))
  // Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
  -----------------------------------------------------
  -----------------------------------------------------
   //  指定最大的分割次数
   print(
        line.characters.split(
             maxSplits: 1, whereSeparator: { $0 == " " }
            ).map(String.init))
  // Prints "["BLANCHE:", "  I don\'t want realism. I want magic!"]"
  -----------------------------------------------------
  -----------------------------------------------------
  print(line.characters.split(omittingEmptySubsequences: false, whereSeparator: { $0 == " " }) .map(String.init))
  // Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"
  • 排序的用法

简单点

 let students: Set = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
 let sortedStudents = students.sorted()// 默认从小到大
// Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]"
let descendingStudents = students.sorted(by: >)
 print(descendingStudents)
 // Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]"

自定义排序规则

 enum HTTPResponse {
         case ok
         case error(Int)
     }

  let responses: [HTTPResponse] = [.error(500), .ok, .ok, .error(404), .error(403)]
  let sortedResponses = responses.sorted {
        switch ($0, $1) {
        // Order errors by code
        case let (.error(aCode), .error(bCode)):
            return aCode < bCode
       // All successes are equivalent, so none is before any other
       case (.ok, .ok): return false
       // Order errors before successes
       case (.error, .ok): return true
       case (.ok, .error): return false
        }
    }
    print(sortedResponses)
   // Prints "[.error(403), .error(404), .error(500), .ok, .ok]"
  • zip 方法的用法

方法定义

zip<Sequence1 : Sequence, Sequence2 : Sequence>(_ sequence1: Sequence1, _ sequence2: Sequence2) -> Zip2Sequence<Sequence1, Sequence2>

用法

 let words = ["one", "two", "three", "four"]
 let numbers = 1...4
 let zipped = Array(zip(words, nnumbers))
// zipped == [("one", 1), ("two", 2), ("three", 3), ("four", 4)]

提示:

如果numbers和words元素的数量不一致,以最少者为准,不会出现报错!

  • 开头等于
 let a = 1...3
 let b = 1...10
print(b.starts(with: a))
// print true
  • 元素等于
let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
print(names.starts(with: ["Sofia"]))
// print true

提示:

集合对象不使用

  • reduce 方法的神奇用法

需求:请数组元素之和

 let numbers = [1, 2, 3, 4]
 let addTwo: (Int, Int) -> Int = { x, y in x + y }
 let numberSum = numbers.reduce(0, addTwo)
 //print 10
  • 几种比例方法的性能对比

a.for ... in

 var array:[Int] = []
for i in 0...1_000_000{
    array.append(i)
}
let date = NSDate()
for i in array{
}
print(NSDate().timeIntervalSince(date as Date))

运行结果:

0.00301897525787354

  • forEach
var array:[Int] = []
for i in 0...1_000_000{
    array.append(i)
}
let date = NSDate()
array.forEach { (a) in 
}
print(NSDate().timeIntervalSince(date as Date))

运行结果:

0.307871997356415

  • enumerated()
var array:[Int] = []
for i in 0...1_000_000{
      array.append(i)
}
let date = NSDate()
for (i,value) in array.enumerated(){ 
}
print(NSDate().timeIntervalSince(date as Date))

运行结果:

0.330793023109436

总结:

for... in的遍历速度是最快的,在数据量不大的情况下,使用三者中的任意一个都可以

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

推荐阅读更多精彩内容