通用参数';结果';无法使用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)
}