【问题标题】:Generics to return a struct of asked Type泛型返回一个询问类型的结构
【发布时间】:2017-07-15 09:09:59
【问题描述】:

我有这样的功能:

func someFunction<T: Codable>(x: Double, y: Double, outputClass: T, completionBlock: CompletionBlock)

完成块是:

enum Result {
    case success(Codable)
    case failure(String?)
}

typealias CompletionBlock = (Result) -> Void

我想要实现的是,当你调用函数时,例如:

someFunction(x: 12, y: 12, outputClass: Foo.self) { (result) in
   switch result {
   case .success(let result):
}

我的 let 结果在成功案例中是 Foo 类型的。

我有一个 Foo 结构:

struct Foo: Codable {
    let content: String
}

现在当我尝试调用 xCode 告诉我的函数时:

Argument type 'Foo.Type' does not conform to expected type 'Encodable'

但结构符合 Codable 类型,即可编码和可解码。

谁能解释一下我做错了什么?

【问题讨论】:

  • 您传递的是 Type 的实例,而不是符合 Codable 的对象的实例。

标签: ios generics swift3


【解决方案1】:

我认为您需要将函数包装在泛型类中,并将枚举也放入类中。这样,您可以使用类的泛型参数T,而不是函数中的T。您也不需要outputType 参数。

class SomeClass<T: Codeable> {
    class func someFunction(x: Double, y: Double, completionBlock: CompletionBlock) {

    }

    enum Result {
        case success(T)
        case failure(String?)
    }

    typealias CompletionBlock = (Result) -> Void
}

struct Foo: Codeable {

}

// usage
SomeClass<Foo>.someFunction(x: 0, y: 0) { (x) in
    switch x {
    case .success(let result):
        // result is now of type Foo
    case .failure:
        break
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多