2015-10-18 171 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

相關問題