2015-10-18 150 views
2

我有一个数组接收Int类型的值,我想在对这些值执行一些转换之后返回String的数组。无法转换类型'Array <String>?'的值指定类型'Array <String>?'

他们看起来像这样:

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

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

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

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

    return stringResult 
} 

其设置为全局函数的作品,但我想它附加也可以作为Array的扩展。当我尝试它,像这样:

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 result: Array<String>? = Array.convertToStrings([1, 2]) 
print("result: \(result)") 

我得到这个错误:

error: cannot convert value of type 'Array?' to specified type 'Array?'

我不知道为什么找生成此错误。

将这个函数封装到更少的全局域空间并附加一个更合理的范围的好方法是什么?

编辑:第2部分

我想使上述功能,其中,I取字符串类型的数组,并转换为Int的阵列时的字符的每个串的计数大于的反向0.但是,我似乎无法做到这一点,因为类似于_IntegerType的唯一协议是_CocoaStringType。

有几件事情:

  1. 我不知道我是否应该使用一种以下划线 前缀
  2. _CocoaStringType不会从任何 允许string.characters.count继承使用。

回答

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" 
+0

如果您想以另一种方式将字符串长度非空时从Int转换为字符串,您将使用哪种类型?字符串是一个结构,无法找到相应的协议,类似于_IntegerType。 –

+0

你的意思是从字符串到int? – Lukas

+0

我在回答中添加了 – Lukas

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)") 
+0

这将如何确保数组元素类型不应该是意外类型,而只是整数? –

+0

扩展接受可用于字符串插值的所有内容。编译器会抱怨别的。 – vadian

相关问题