我在Swift中尝试了一些示例代码,并结合了两个原则:Array.map和Extension。不幸的是,我得到错误代码“'T'与'Int'不同”(第3行)。所以我的问题应该是:如何将T数组转换为Int数组?
提前感谢您的回答!
干杯。
extension Array {
func translateToDigitalNames()-> [String] {
var numbers : [Int] = self
let digitNames =
[0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"]
var strings = numbers.map {
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
return strings
}
}
let x = [26, 158, 610]
x.translateToDigitalNames()
答案 0 :(得分:1)
您也可以使用地图功能创建numbers
数组,例如:
var numbers = map { $0 as Int }
答案 1 :(得分:1)
编写此类扩展并不是一个好主意,因为它仅适用于[Int]
数组。如果你愿意怎么办
["some", "strings"].translateToDigitalNames()
而是使用这样的函数:
func translateToDigitalNames(numbers:[Int])-> [String] {
let digitNames =
[0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",
5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"]
var strings = numbers.map {
(var number) -> String in
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
return strings
}
let x = [26, 158, 610]
translateToDigitalNames(x)
因此,编译器可确保您始终提供[Int]
答案 2 :(得分:1)
我会将问题分成3个不同的子问题。
第一种是将整数转换为字符串表示形式,实现为静态方法:
private static func translateToDigitalName(var number: Int) -> String {
var output = ""
while number > 0 {
output = digitNames[number % 10]! + output
number /= 10
}
return output
}
使其成为一个单独的功能的原因是:关注点分离,可重用性和可读性。
接下来,我们可以实现一个静态方法,给定一个整数数组,返回它们各自的字符串表示的数组:
private static func translateToDigitalNames(numbers: [Int])-> [String] {
return numbers.map { self.translateToDigitalName($0) }
}
最后,实际的数组扩展。我使用的方法是通过排除不可转换为Int:
的元素来过滤数组func translateToDigitalNames()-> [String] {
let numbers: [Int] = self.filter { $0 is Int }.map { $0 as Int }
return Array.translateToDigitalNames(numbers)
}
如果您希望如果至少有一个数组元素不是Int,则转换失败,只需添加一个显式检查并在这种情况下返回nil:
func translateToDigitalNames()-> [String]? {
let numbers: [Int] = self.filter { $0 is Int }.map { $0 as Int }
if numbers.count != self.count {
return nil
}
return Array.translateToDigitalNames(numbers)
}
请注意,返回类型现在是可选的。
最后,我没有在每个函数调用中创建digitNames
数组,而是将其作为私有全局变量和不可变变量移动
完整代码可在this gist
上找到附注:translateToDigitalNames
和translateToDigitalName
可以作为全局和公共函数移出数组扩展名之外 - 这实际上是我建议您使用的内容需要在将来重复使用它们。