【问题标题】:How to use a generic inside of a function, but not in the signature? [Swift 2]如何在函数内部使用泛型,但不在签名中? [斯威夫特 2]
【发布时间】:2015-09-05 07:23:42
【问题描述】:

我正在尝试做这样的事情:

//: Playground 

import Cocoa

protocol FeedItem {
    var foo: Int {get}
}

protocol FeedFetchRequest {
    func fetchItems<T:FeedItem>(success success: ([T])->())
}

class MyFeedController {
    func fetchItems<T:FeedFetchRequest, G:FeedItem>(request: T) {
        request.fetchItems{ (items: [G]) -> () in
            //do stuff
        }
    }
}

但是,我收到错误 Generic Parameter 'G' is not used in function signature。将 G 添加为可选返回值使我可以在内部使用它,但这似乎很老套,因为我不想返回任何东西。

【问题讨论】:

  • 也许func fetchItems&lt;T:FeedFetchRequest, G:FeedItem&gt;(request: T, ofType: G.Type) {...} ?无论如何,您必须以某种方式将 G 类型传递给函数
  • 或者,看看这个stackoverflow.com/questions/24469913/…,你可以使用typealias使FeedFetchRequest成为一个通用协议,然后你就不需要在fetchItems签名中使用G了

标签: generics swift2


【解决方案1】:

发生错误是因为编译器无法推断 G 的类型,因为您无法提供任何详细信息作为参数或返回类型。

在此示例中,您可以通过将类型指定为参数来帮助编译器:

func fetchItems<T:FeedFetchRequest, G:FeedItem>(request: T, type: G.Type)

解决此问题的另一种方法是将协议要求设为非通用函数,如果这适合您的项目,则该函数采用 heterogeneous 数组 FeedItem

protocol FeedFetchRequest {
    func fetchItems(success success: [FeedItem]->())
}

class MyFeedController {
    func fetchItems<T:FeedFetchRequest>(request: T) {
        request.fetchItems{ (items: [FeedItem]) -> () in
            //do stuff
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-02-15
    • 2017-07-22
    • 2017-11-14
    • 2016-07-26
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多