无法转换'Array <string>类型的值?'指定类型'Array <string>?'

时间:2015-10-18 22:19:07

标签: swift2

我有一个接收this.类型值的数组,我希望在对值进行一些转换后返回Int数组。

他们看起来像这样:

String

我正在每个阵列上执行的映射:

var ints: Array<Int> = [1, 2, 3, 4]
var strings: Array<String> = Array<String>()

将其设置为全局函数有效,但我想将其附加到对象,可能作为Array的扩展。当我这样尝试时:

func convertToStrings(array: Array<Int>?) -> Array<String>? {
    var stringResult: Array<String>? = nil

    if let x = array {
        stringResult = x.map { "Transformed: \($0)" }
    }

    return stringResult
}

这个用法:

extension Array {
    static func convertToStrings(array: Array<Int>?) -> Array<String>? {
        var stringResult: Array<String>? = nil

        if let x = array {
            stringResult = x.map { "Transformed: \($0)" }
        }

        return stringResult
    }
}

我收到此错误:

  

错误:无法转换'Array'类型的值到指定的类型   '阵列?'

我不确定为什么会产生这个错误。

将此函数封装到较少的全局域空间并将其附加到更合理的范围内有什么好方法?

编辑:第2部分

我想反过来上面的函数,我在这里使用一个String类型的数组,并在每个字符串的字符数大于0时转换为Int of Array。但是,我似乎无法这样做是因为与_IntegerType类似的唯一协议是_CocoaStringType。

一些事情:

  1. 我不确定我是否应该使用带下划线的类型 前缀
  2. _CocoaStringType不会从任何内容继承 允许使用string.characters.count。

2 个答案:

答案 0 :(得分:0)

数组适用于所有类型,因此无论数组包含什么,您的扩展名都将适用。我建议创建一个扩展符合的协议,以避免在[UIView]数组或[String]数组上调用这个扩展方法,这个方法没有意义。以下内容符合_IntegerType,但您也可以使用自己的协议

extension Array where Element: _IntegerType {
    static func convertToStrings(array: [Element]?) -> [String]? 
    {
        var stringResult: [String]?

        if let x = array {
            stringResult = x.map { "Transformed: \($0)" }
        }

        return stringResult
    }
}

既然你问过,你可以做相反的事情(将字符串数组元素转换为Int,如下所示

extension Array where Element: StringLiteralConvertible {
    static func convertToInt(array: [Element]?) -> [Int]? 
    {
        var intResult: [Int]?
        if let x = array {
            intResult = x.map{Int("\($0)")!}
        }
        return intResult
    }
}
var r:[Int]? = Array.convertToInt(["1", "4"])
print(r) // this will print "Optional[1, 4]\n" 

答案 1 :(得分:0)

解决方案是Array扩展,约束为CustomStringConvertible(前Printable),将所有类型声明为非可选

更容易 - 也更合理
extension Array where Element: CustomStringConvertible {
  static func convertToStrings(array: [Element]) -> [String]
  {
    return array.map { "Transformed: \($0)" }
  }
}

let result = Array.convertToStrings([1, 2])
print("result: \(result)")