通用参数';结果';无法使用RxSwift推断

通用参数';结果';无法使用RxSwift推断,swift,closures,rx-swift,Swift,Closures,Rx Swift,我是斯威夫特的新手,所以这个问题可能有点愚蠢。我不知道我为什么会在这里出错: htmlHelper.fetchHtmlObservable(url) // this one is an Observable<String> function .subscribeOn(ConcurrentDispatchQueueScheduler.init(qos: .background)) .map { //Generic parameter 'R

我是斯威夫特的新手,所以这个问题可能有点愚蠢。我不知道我为什么会在这里出错:

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)
            }

什么时候可以省略
参数
返回
类型?

为了在闭包中进行类型推断,通常需要外部范围来了解类型,或者闭包本身需要是一行。这是Swift类型系统中的一个限制。因此,要么:

htmlhelp.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.地图{
ParsingTypeFactory.getParsingType(parsingType:self.parsingType).parseActionItems(文档:$0)
}

let myItems:Observable=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.地图{
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:self.parsingType)
返回parsingHelper.parseActionItems(文档:$0)
}
其他选择: 请注意,在到目前为止讨论的所有情况下,您持有对self的强引用,并且可能导致内存循环/泄漏。通过创建不属于类的帮助器函数,可以避免这种情况:

//不要将其放入类中,将其设置为自由函数(可能是私有函数,以避免名称空间污染。)
func解析器(用于parsingType:parsingType)->(文档)->[MyItem]{
返回{中的文档
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:parsingType)
return parsingHelper.parseActionItems(文档:document)
}
}
现在讨论的代码变成:

let myItems=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.map(解析器(用于:parsingType))

如果您不喜欢自由函数的概念,或者不喜欢返回函数的函数,可以将该函数放在ParserType的扩展中:

extension ParsingType{
func解析器(文档:文档)->[MyItem]{
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:self)
return parsingHelper.parseActionItems(文档:document)
}
}
现在原始代码变成:

let myItems=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.map(parsingType.parser(文档:))

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

为了在闭包中进行类型推断,通常需要外部范围来了解类型,或者闭包本身需要是一行。这是Swift类型系统中的一个限制。因此,要么:

htmlhelp.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.地图{
ParsingTypeFactory.getParsingType(parsingType:self.parsingType).parseActionItems(文档:$0)
}

let myItems:Observable=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.地图{
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:self.parsingType)
返回parsingHelper.parseActionItems(文档:$0)
}
其他选择: 请注意,在到目前为止讨论的所有情况下,您持有对self的强引用,并且可能导致内存循环/泄漏。通过创建不属于类的帮助器函数,可以避免这种情况:

//不要将其放入类中,将其设置为自由函数(可能是私有函数,以避免名称空间污染。)
func解析器(用于parsingType:parsingType)->(文档)->[MyItem]{
返回{中的文档
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:parsingType)
return parsingHelper.parseActionItems(文档:document)
}
}
现在讨论的代码变成:

let myItems=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.map(解析器(用于:parsingType))

如果您不喜欢自由函数的概念,或者不喜欢返回函数的函数,可以将该函数放在ParserType的扩展中:

extension ParsingType{
func解析器(文档:文档)->[MyItem]{
让parsingHelper=ParsingTypeFactory.getParsingType(parsingType:self)
return parsingHelper.parseActionItems(文档:document)
}
}
现在原始代码变成:

let myItems=htmlHelper.fetchHtmlObservable(url)//这是一个可观察的函数
.subscribeOn(ConcurrentDispatchQueueScheduler.init(qos:.background))
.map(parsingType.parser(文档:))

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

谢谢。依我看,单线图的功能真的很难读懂。在这里声明类型
Observable
并没有真正的帮助,尤其是在map函数中,因为将来可以添加更多map函数。因此,我在中继续使用:
doc->[MyItem],我更喜欢
版本中的
(doc)->[MyItem]。或者我创建了一个包含多行的helper函数。我会在答案中加上一个例子。谢谢。依我看,单线图的功能真的很难读懂。在这里声明类型
Observable
并没有真正的帮助,尤其是在map函数中,因为将来可以添加更多map函数。因此,我在
中继续使用:
doc->[MyItem],我更喜欢
版本中的
(doc)->[MyItem]。或者我创建一个包含m的helper函数
.map { doc -> [MyItem] in
     let parsingHelper = ParsingTypeFactory.getParsingType(parsingType: self.parsingType)
     return parsingHelper.parseActionItems(document: doc)
}