Swift2 无法转换类型为';数组<;字符串>';到指定类型';数组<;字符串>';

Swift2 无法转换类型为';数组<;字符串>';到指定类型';数组<;字符串>';,swift2,Swift2,我有一个数组正在接收Int类型的值,我想在对值执行一些转换后返回String类型的数组 它们看起来像这样: var ints: Array<Int> = [1, 2, 3, 4] var strings: Array<String> = Array<String>() var-ints:Array=[1,2,3,4] 变量字符串:Array=Array() 我在每个阵列上执行的映射: func convertToStrings(array: Array&l

我有一个数组正在接收
Int
类型的值,我想在对值执行一些转换后返回
String
类型的数组

它们看起来像这样:

var ints: Array<Int> = [1, 2, 3, 4]
var strings: Array<String> = Array<String>()
var-ints:Array=[1,2,3,4]
变量字符串:Array=Array()
我在每个阵列上执行的映射:

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

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

    return stringResult
}
func convertToStrings(数组:数组?->array?{
var stringResult:数组?=nil
如果设x=array{
stringResult=x.map{“已转换:\($0)”}
}
返回字符串结果
}
将其设置为全局函数是可行的,但我想将其附加到一个对象,可能是作为数组的扩展。当我这样尝试时:

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
    }
}
扩展数组{
静态函数转换字符串(数组:数组?->数组{
var stringResult:数组?=nil
如果设x=array{
stringResult=x.map{“已转换:\($0)”}
}
返回字符串结果
}
}
使用此用法:

var result: Array<String>? = Array.convertToStrings([1, 2])
print("result: \(result)")
var结果:数组?=Array.converttoString([1,2])
打印(“结果:\(结果)”)
我得到这个错误:

错误:无法将“数组”类型的值转换为指定的类型 “阵列?”

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

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

编辑:第2部分

我想对上面的函数做相反的处理,当每个字符串的字符数大于0时,我获取一个字符串类型数组并转换为Int数组。然而,我似乎无法做到这一点,因为与_IntegerType类似的唯一协议是_CocoaStringType

有几件事:

  • 我不确定是否应该使用带下划线的类型 前缀
  • _CocoaStringType不继承任何 允许使用string.characters.count

  • 数组适用于所有类型,因此无论数组包含什么,扩展都将应用。我建议创建一个扩展符合的协议,以避免在[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" 
    

    解决方案是一个
    数组
    扩展,限制为
    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)")
    

    当字符串长度为非空时,如果您想换一种方式,从Int转换为String,您会使用什么类型?String是一个结构,无法找到与_IntegerType类似的相应协议。您是指从String到Int吗?我在回答中添加了这一点谢谢。最后一个问题与此相关。我在map函数之前添加了一个筛选器n仅当字符串非空时才执行转换。让element.characters.count>0}中的filtered=x.filter{(element:string)。但这会引发错误:“表达式类型不明确,没有更多上下文”。使用字符串扩展方法的好方法是什么?同样,扩展位于数组上,因此元素类型为Element,因此Element:String没有意义。让filtered=x.filter{(Element:Element)in(Element as?String)?.characters.count>0}这将如何确保数组元素类型不应是意外的类型,而应是唯一的整数?扩展接受字符串插值中可以使用的所有内容。编译器将抱怨任何其他内容。