我有一个功能:

static func requestArray<T>(completion: @escaping (_ result: Result<[T], Error>) -> ()) {

}

像这样被称为:

MyClass.requestArray() { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

但是,这不起作用,因为它无法推断出通用类型T。如何更改我的代码,使其能够识别T应该是什么类型? (假设array的类型应为[String]

#1楼 票数:1

如果将API将类型移动到签名中,通常会更加方便,以简化闭包:

static func requestArray<T>(of: T.Type, completion: @escaping (_ result: Result<[T], Error>) -> ()) { }

通过这种方式完成后,调用将变为:

MyClass.requestArray(of: String.self) { result in
    switch result {
        case .success(let array):
            break
        case .failure(let error):
            break
        }
}

T是返回类型时,此方法也很好用。 有关Codeable的一个很好的例子,请参见Codeable ,如decode(_;from:)

#2楼 票数:0 已采纳

调用函数时,已在完成处理程序中显式声明了result类型:

MyClass.requestArray() { (result: Result<[String], Error>) in
    switch result {
    case .success(let array):
        break
    case .failure(let error):
        break
    }
}

  ask by Tometoyou translate from so

未解决问题?本站智能推荐:

2回复

无法使用完成块推断静态函数上的泛型类型

我有一个使用泛型的静态函数,但无法在调用泛型时推断出它。 功能: 调用使用: 这给出了错误: Generic parameter 'T' could not be inferred 。 如何使函数的通用部分起作用?
2回复

无法转换'T?'类型的值预期的参数类型'_?'-通用类型和完成块

我试图实现AlamofireObjectMapper ( https://github.com/tristanhimmelman/AlamofireObjectMapper与Alamofire 3和最新版本ObjectMapper的() https://github.com/Hearst-DD/
3回复

IOSswift中的完成块

我正在尝试将一个可空的完成块添加到自定义函数 当我试图调用上面的函数时,如下所示 完成块始终为零。
4回复

快速通用类型推断

所以我想知道是否有人可以解释此错误背后的原因或对我正在做错的事情的解释。 我正在尝试创建一个通用的函数,该函数采用协议约束类型,该协议上有一个称为Solve的静态方法。 但是由于某种原因,即使它解决了Xcode中的约束问题,编译器仍会发出嘶嘶声。 是否有任何原因不能解释我已经指定的类
2回复

Swift中的完成块语法

慢慢进入Swift,但仍在完成区块方面挣扎。 以下代码在Swift中的外观如何?
1回复

SpriteKit中的完成块从未调用

我目前有一些完成块,应该在完成滑动手势后执行。 我将断点放在应该在完成块中调用的函数中,但从未触发过。 滑动手势有效,但我不确定为什么不调用完成块。 这是我的代码:
1回复

在setCollectionViewLayout中从未调用的完成块

我通过移动单元格来更新UICollectionView的布局。 但是,在正确完成动画的同时,永远不会调用setCollectionViewLayout的完成块。 任何想法 ? 谢谢
2回复

Swift中的HomeKit完成块:无法将表达式的类型'Void'转换为'String!'类型

我正在玩HomeKit,我正在尝试添加一个新家。 这是我的代码: 这给出了编译器错误: 我试过指定一个返回类型的Void : 无济于事。 有没有人有任何想法如何解决这个问题? 将nil传递给完成处理程序可以修复错误,但我当然希望在完成时执行某些操作。