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

sab*_*abi 2 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
}
Run Code Online (Sandbox Code Playgroud)

请注意我使用的第二行"0123...".characters.map{$0},我对这个(工作)语法的使用感到困惑。绘制地图而不执行任何操作是什么意思?是否有用于相同目的的更解释性语法?

Mar*_*n R 5

someString.characters将字符串的字符返回为 a String.CharacterView,该字符串的CollectionType索引为 String.CharacterView.Index

对于函数来说,有一个由 索引的whichgenerateRandomChar()会更方便。ArrayInt

map { $0 }是一个快捷符号

map { c in 
    return c
}
Run Code Online (Sandbox Code Playgroud)

即带有“身份转换”的闭包。此处完成此操作是因为map()应用于任何序列的方法都会返回Array

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

或者,您可以使用以下方法获得相同的结果

let characters = Array("012 ... XYZ".characters)
Run Code Online (Sandbox Code Playgroud)

备注:您的generateRandomString()函数可以简化为

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