将字符串转换为字符迫使我映射{$ 0},这是什么意思?

时间:2016-05-26 08:29:26

标签: swift map-function

写一个randomStringGenerator()函数,我提出了这个:

private let characters = ("0123456789" + "abcdefghijklmnopqrstuvwxyz" +
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ").characters.map{ $0 }

private func generateRandomChar() -> Character {
  let index = Int( arc4random_uniform( UInt32( characters.count)))
  return characters[index]
}

func generateRandomString(lenght: Int) -> String {
  var string = ""
  for _ in 0..<lenght {
    string.append(generateRandomChar())
  }
  return string
}

请注意我使用"0123...".characters.map{$0}的第二行,我对使用此(工作)语法感到困惑。映射和什么都不做是什么意思?是否有更明确的语法用于相同的目的?

1 个答案:

答案 0 :(得分:4)

someString.characters返回字符串的字符 String.CharacterViewCollectionType索引 String.CharacterView.Index

对于generateRandomChar()函数,它更方便 由Array编制索引的Int

map { $0 }

的快捷符号
map { c in 
    return c
}

即。一个带有“身份变换”的闭包。这是在这里完成的 因为应用于任何序列的map()方法返回Array

public func map<T>(@noescape transform: (Self.Generator.Element) throws -> T) rethrows -> [T]

或者,您可以使用

获得相同的结果
let characters = Array("012 ... XYZ".characters)

备注:您的generateRandomString()功能可以简化为

func generateRandomString(length: Int) -> String {
    return String((0 ..< length).map { _ in generateRandomChar() })
}