Swift ';T';与';Int';

Swift ';T';与';Int';,swift,dictionary,type-conversion,Swift,Dictionary,Type Conversion,我正在尝试Swift中的一些示例代码,并结合了两个原则:Array.map和Extension。不幸的是,我得到了错误代码“'T'与'Int'不同”(第3行)。所以我的问题可能是:如何将T数组转换为Int数组 提前感谢您的回答 干杯 extension Array { func translateToDigitalNames()-> [String] { var numbers : [Int] = self let digitNames =

我正在尝试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()

您还可以使用map函数创建
numbers
数组,如:

var numbers = map { $0 as Int }

编写这种扩展不是一个好主意,因为它只适用于
[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]

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

完整代码可在


旁注:
translateToDigitalNames
translateToDigitalName
可以作为全局和公共功能移动到数组扩展之外-这实际上是我建议的,以防将来需要重用它们。

您认为扩展不是一个好主意。然而,这对我来说是一个练习,让我获得扩展的经验,并使用“self”作为变量。不过还是要谢谢你的明确答复!嗯,我不知道这是怎么回事,但确实是这样。但是为什么现在要两次使用map函数呢?我有点困惑…@etri,你实际上检查了self的每个元素,并将其转换为int,基本上,就是你想要的,以消除错误。