首页 > 解决方案 > String.init 期间发生了什么

问题描述

我发现这个示例函数接受一个整数,然后将数字从大到小排序。示例输入:12345 输出:54321。该解决方案有效,但我试图理解 String.init 部分。谁能解释发生了什么?

func descendingOrder(of number: Int) -> Int {
    let s =  String(number).sorted().reversed()
    return Int(s.compactMap(String.init).joined())!
}

标签: swiftstringinitialization

解决方案


s是类型ReversedCollection<[String.Element]>,所以它使从String.Element到的转换是内部循环的String含义String.initcompactMap

当您看到时,DataType.init您需要知道被循环的项目是该类型的 init 的参数,因此在 String 的字符上发生循环以生成一个新的 [String] 作为结果

开发人员把这条线复杂化了,为了更容易理解,可以简化为这个

func descendingOrder(of number: Int) -> Int {
    let s =  String(number).sorted().reversed() // sort and reverse the string descendinng 
    let arr = s.compactMap(String.init) // convert characters to array of strings
    let joined = arr.joined() // join them in 1 string
    let res = Int(joined)! // convert string to int
    return res
}

或者在评论中

func descendingOrder(of number: Int) -> Int {
    let s =  String(number).sorted().reversed() // sort and reverse the string descendinng
    let arr = s.map{ String($0) } // convert characters to array of strings
    let joined = arr.joined() // join them in 1 string
    let res = Int(joined)! // convert string to int
    return res
}

推荐阅读