2017-01-16 42 views
0

我想創建一個擴展String它接受一個類型T作爲輸入,並通過一String作爲輸入創建該類型T以字符串分隔成部件的Array泛型ExpressibleByStringLiteral字符串轉換

extension String { 
    func convertToArrayOfTypesWithSeperator<T: ExpressibleByStringLiteral>(type : T.Type, seperator: String) -> [T] { 
     var res : [T] = [] 
     self.components(separatedBy: seperator).forEach { s in 
      // Cast to Type 
      // Add to res 
     } 
     return res 
    } 
} 

現在我知道了T必須符合ExpressibleByStringLiteral其作爲docs國家應該有一個初始化:

init(stringLiteral value: Self.StringLiteralType) 

所以我嘗試我的字符串組成s投用我作爲輸入傳遞類型:

let t = type.init(stringLiteral: s) 

但我不斷收到關於有使用這些參數沒有初始化它的錯誤。這裏出了什麼問題?

+0

這是否真的值得的延伸? 's.components(separatedBy:「,」).map(SomeClass.init)' – Alexander

+1

您應該使用功能映射算法,它使得事情更簡單:'yourString.components(separatedBy:separator).map {YourType($ 0)} ' – Palle

+0

但是如果你有比我目前寫的更具體的要求。在這種情況下,不是關於結果,而是使用泛型實現它的方法。 – Emptyless

回答

0

我沒有使用它自己,但從它的外觀我看不到有什麼保證Self.StringLiteralType必須等於String,因此,您不能只將String的實例傳遞給構造函數。

解決方案:投sT.StringLiteralType

+0

在移動設備上輸入時有點糊塗。但希望現在修好。 – Andreas

+0

是的,謝謝!它現在有效。不符合我的最終目標(使用Int和Float作爲函數參數T,因爲它們具有init(text:String),但是可以處理字符串文字。 – Emptyless

+0

爲什麼不直接定義自己的協議並擴展所有類型你想要使用嗎?不需要依賴'ExpressibleByStringLiteral'。 – Andreas