2014-10-07 51 views
2
func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> { 

    func cat<T>(initial:Array<T>,element:T) -> Array<T> { 
     var mInitial = initial; 
     var telement = transform(element); 
      mInitial.append(telement); 
     return mInitial; 
    } 
    var k = collection.reduce([],cat); 
    return k; 
} 

我遇到了試圖運行這段代碼的問題。 我新來的swift任何人都可以幫我嗎?Swift T不會轉換爲T

我想寫一個通用的地圖出來的減少功能,它似乎並沒有工作。

+0

嘗試更改'func貓'到'func貓' – 2014-10-07 22:23:14

回答

4

這裏:

func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> { 

要定義泛型類型T,而在嵌套函數:

func cat<T>(initial:Array<T>,element:T) -> Array<T> { 

你(重新)定義一個新的泛型類型具有相同的名稱,但這實際上是一種不同的類型 - 你甚至可以將它命名爲V或NewType,但你仍然有相同的錯誤。

我扣你的情況,你要嵌套函數使用相同的T型,所以纔不重新定義它:

func cat(initial:Array<T>,element:T) -> Array<T> { 

,並如預期

+1

謝謝你的解釋 – 2014-10-07 22:33:44

1

爲了使錯誤它應該工作消息(目前聽起來很無意義的)更清晰,讓我們重命名的類型變量,這樣你就不會具有相同名稱的兩個類型變量:

func mapGen<T1>(transform:((T1)->T1),collection:Array<T1>) -> Array<T1> { 

    func cat<T2>(initial:Array<T2>,element:T2) -> Array<T2> { 
     var mInitial = initial; 
     var telement = transform(element); 
      mInitial.append(telement); 
     return mInitial; 
    } 
    var k = collection.reduce([],cat); 
    return k; 
} 

現在的錯誤MES聖人變成「T1不轉換爲T2」,這使得更有意義。你得到這個錯誤的原因是表達式transform(element)element的類型爲T2,但transform預計類型爲T1的參數。

根本問題是,你允諾cat可以與任何給定類型的工作,但在現實中,它只能與外T的值工作,因此該解決方案是簡單地去除cat類型參數和在參數的類型中使用外部的T

+0

是的,我大約5秒前意識到,我在第二個函數中嵌套了2個ts。 – 2014-10-07 22:25:46