2016-02-24 39 views
1

所以我試圖用AnyGenerator包裹通用GeneratorType,但是我得到的錯誤:如何在Swift中實例化AnyGenerator <T>?

Argument passed to call that takes no argument 

這似乎從一個奇怪的模糊性延伸有既是AnyGenerator結構(一個我expect)和一個旨在作爲抽象類的擴展實現的類。

但是我沒有任何想法如何指定一個比其他的,因爲所有的文件我能找到我建議應該只使用:

let someGenerator = ["foo"].generate() 
let anyGenerator = AnyGenerator(someGenerator) 

有沒有別的東西,我可以做的呢?對於額外的樂趣似乎也有一個anyGenerator全局函數,只是爲了確保沒有人有任何想法是怎麼回事;)

+0

因爲存在一個全局本地函數'anyGenerator(..)',你可能應該避免具體的名稱'anyGenerator'sspecifly_,目的是爲給定的'Element'返回'AnyGenerator',[見這裏](http: //swiftdoc.org/v2.0/func/anyGenerator/)。 – dfri

+0

如果你堅持要調用你自己的變量「anyGenerator」,那麼'讓anyGenerator = Swift.anyGenerator(someGenerator)'會做到這一點(不是我會推薦它:) –

+0

@MartinR奇怪的是, anyGenerator(base:)'不是'AnyGenerator',而是一個內部(?)類型'_GeneratorBox'([例如this](https://gist.github.com/dfrib/7bbb2228038e7604e619)),這是預期的嗎? – dfri

回答

2

可以使用anyGenerator<G : GeneratorType>(_: G) function創建您AnyGenerator<...>實例

signature:

func anyGenerator<G : GeneratorType>(base: G) -> AnyGenerator<G.Element> 

description:

Return a GeneratorType instance that wraps base but whose type depends only on the type of G.Element .

例子:

struct Foo : GeneratorType { 
    typealias Element = String 
    mutating func next() -> String? { 
     return "foo" 
    } 
} 

var bar = anyGenerator(Foo()) 

func foofoo(bar: AnyGenerator<String>) { 
    print("foobar") 
} 

foofoo(bar) // "foobar", ok 

正如我在你的問題評論中寫道,你應該避免的具體名稱anyGenerator明確,因爲存在一個全球性的本地函數anyGenerator(..)


另外,請參閱@MartinR:對上述問題的評論;兩個全局函數anyGenerator即將被棄用(Swift 2.2),並將在Swift 3.0中被移除,以支持AnyGenerator上的初始值設定項。