通用参数'Result'无法用RxSwift推断。

我是刚接触Swift的新手,所以可能这个问题有点笨。我不知道为什么我这里会出现错误。

htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function
            .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background))
            .map { //Generic parameter 'Result' could not be inferred
                let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: self.parsingType)
                return parsingHelper.parseActionItems(document: $0)
            }

为了解决这个问题,我必须添加

.map { doc -> [MyItem] in
     let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: self.parsingType)
     return parsingHelper.parseActionItems(document: doc)
}

什么时候可以省略 paramsreturn 类型?

解决方案:

为了让类型推理在闭包中工作,一般需要外域知道类型或者闭包本身需要是一行。这是Swift类型系统的一个限制。所以要么

htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function
    .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background))
    .map {
        ParsingTypeFactory.getParsingType(parsingType: self.parsingType).parseActionItems(document: $0)
    }

或者

let myItems: Observable<[MyItem]> = htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function
    .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background))
    .map {
        let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: self.parsingType)
        return parsingHelper.parseActionItems(document: $0)
    }

其他选项。

请注意,在目前讨论的所有情况下,你都持有对self的强引用,很可能造成内存循环泄漏。你可以通过制作一个不属于类的辅助函数来避免这种情况。

// do NOT put this in the class, make it a free function (possibly private to avoid namespace pollution.)
func parser(for parsingType: ParsingType) -> (Document) -> [MyItem] {
    return { document in
        let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: parsingType)
        return parsingHelper.parseActionItems(document: document)
    }
}

而现在的代码就变成了:

let myItems = htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function
    .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background))
    .map(parser(for: parsingType))

如果你不喜欢自由函数的概念 或者你不喜欢一个返回函数的函数 你可以把函数放在ParserType的扩展里

extension ParsingType {
    func parser(document: Document) -> [MyItem] {
        let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: self)
        return parsingHelper.parseActionItems(document: document)
    }
}

现在原来的代码就变成了:

let myItems = htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function
    .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background))
    .map(parsingType.parser(document:))

这也避免了保留对self的引用。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何过滤对象数组的数组?

2022-9-9 1:06:20

未分类

react中的目标容器不是DOM元素

2022-9-9 1:06:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索