gpt4 book ai didi

swift - 'T' 与 'Int' 不同

转载 作者:搜寻专家 更新时间:2023-11-01 06:47:26 25 4
gpt4 key购买 nike

我正在 Swift 中尝试一些示例代码并结合了两个原则:Array.map 和扩展。不幸的是,我收到错误代码“‘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()

最佳答案

我会将问题拆分为 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 数组,而是将其作为私有(private)全局变量和不可变变量移动

完整代码可在 this gist 上获得

旁注:translateToDigitalNamestranslateToDigitalName 可以作为全局函数和公共(public)函数移到数组扩展之外 - 这实际上是我推荐的,以防万一需要在将来重用它们。

关于swift - 'T' 与 'Int' 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28807868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com