2016-04-25 24 views
4

我正在通過Swift 2.2附帶的「Guided Tour」遊樂場。在仿製藥的一章,你得到這個非常繁瑣的函數聲明甩了你:在Swift中實例化相關類型的數組

func anyCommonElements <T: SequenceType, U: SequenceType where 
    T.Generator.Element: Equatable, 
    T.Generator.Element == U.Generator.Element> 
    (lhs: T, _ rhs: U) -> Bool { 

    for lhsItem in lhs { 
     for rhsItem in rhs { 
      if lhsItem == rhsItem { 
       return true 
      } 
     } 
    } 
return false 

} 
anyCommonElements([1, 2, 3], [3]) 

該函數返回兩個序列是否具有任何公共元素,這是很簡單的。

本章的練習是修改函數以返回兩個序列之間的公共元素的數組。由此我得到的功能需要有一個返回類型像

(lhs: T, _ rhs: U) -> [T.Generator.Element] 

這說起來簡單,做一個數組,把共同的元素在裏面,然後返回。但是到目前爲止,本書中沒有任何東西教會我如何製作一個新的[T.Generator.Element]類型的數組,因此我不知道如何繼續。我自然認爲這樣的事情會工作:

var result = [T.Generator.Element]() 

但是,是不會編譯。那麼我如何解決這個問題呢? (對於首次引入仿製藥,這不是一點點先進嗎?)

回答

1

你是對的,它應該工作。它不是a known bug in the Swift compiler。您有一種變通方法幾種選擇:

  • var result: [T.Generator.Element] = []

  • var result = [] as [T.Generator.Element]

  • var result = Array<T.Generator.Element>()

(訣竅是給編譯器足夠的情況下,它知道它的嘗試在那裏解析類型名稱在[T.Generator.Element]()語法中它錯誤地解析括號中的部分爲數組字面)。

相關問題