2016-08-19 54 views
4

我正在玩Swift,試圖讓它看起來更「動態類型」 - 只是爲了好玩,沒有預期的產品價值。有沒有辦法在Swift中重寫Array來進行字符串投射?

現在我堅持將內建類型轉換爲String的覆蓋行爲。

例如,我想看看這個輸出Array

let nums = [1, 2, 3] 
print(nums) // "I'm an array" 

到目前爲止,我試圖

  • 提出延期至NSArray(未編譯)
  • 實施CustomStringConvertible (未編譯)
  • Array進行了擴展(編譯,無變化)

好像我在錯誤的道路上:

extension Array { 
    public var description: String { return "An array" } 
} 

斯威夫特至少可行的是嗎?

任何想法?

+0

你是對實施CustomStringConvertible,也許表明代碼,這裏有一個例子:Var描述:字符串{ VAR DESC = 「陣:」 爲ITE,在項目{ 遞減+ =「\ (項目)「+」,「 } 回報遞減+‘]’ } –

+0

正如我上面寫,實施'CustomStringConvertible'用於'Array'不編譯與一個錯誤:的‘陣列’冗餘一致性協議'CustomStringConvertible'。 –

+0

實現從Array繼承並且符合CustomStringConvertible的Array。 –

回答

2

這不起作用,因爲數組重寫說明。如果數組沒有覆蓋它,那麼它會打印「一個數組」。類方法在擴展中「勝利」。

extension Array { 
    public var description: String { return "An array" } 
} 

你可以爲你的數組創建一個Wrapper類。這是一種解決方法,但不會覆蓋數組的描述本身。

class ArrayWrapper<T> : CustomStringConvertible{ 
    var array : Array<T> = Array<T>() 
    var description: String { return "An array" } 
} 

然後你可以像這樣使用它。

var array = ArrayWrapper<Int>() 
array.array = [1,2,3] 
print(array) //prints "An Array" 
print(array.array) //still prints "[1, 2, 3]" 
+0

感謝您的洞察! –

-1

似乎不可能既不劃分也不覆蓋內建的Array類型。

雖然我們可以使用包裝(信用於@Yannick)並實現ArrayLiteralConvertible協議,所以我們可以使用方括號進行初始化。

struct Array<T> { 
    let array: [T] 
} 

extension Array: ArrayLiteralConvertible { 
    init(arrayLiteral elements: T...) { 
     self.array = elements 
    } 
} 

extension Array: CustomStringConvertible { 
    var description: String { return "An array" } 
} 

let array = [1,2,3] 
print(array) // "An array\n" 
相關問題