* 类型的值没有成员 'rx'

Posted

技术标签:

【中文标题】* 类型的值没有成员 \'rx\'【英文标题】:Value of type * has no member 'rx'* 类型的值没有成员 'rx' 【发布时间】:2018-12-03 09:50:29 【问题描述】:

我正在尝试为来自 AlamofireImage 的 ImageDownloader 制作一个小的反应式包装器:

import Foundation
import UIKit.UIImage
import AlamofireImage
import RxCocoa
import RxSwift


extension Reactive where Base: ImageDownloader 

    public func download(urlRequest: URLRequest, filter: ImageFilter?) -> Observable<UIImage> 

        return Observable.create  observer in

            self.base.download(urlRequest, filter: filter)  response in

                if let error = response.error 
                    observer.onError(error)
                 else if let image = response.value 
                    observer.onNext(image)
                
            
            return Disposables.create()
        
    

它编译没有问题。但是,当我尝试在 ImageDownloader 实例上调用 rx.download 时,我收到一条错误消息,指出那里没有“rx”扩展名:

你猜为什么会这样?

【问题讨论】:

【参考方案1】:

您需要先符合ReactiveCompatible 协议,然后才能在您的downloadRequest 调用中使用'rx'

import AlamofireImage
import RxSwift

extension ImageDownloader: ReactiveCompatible 

extension Reactive where Base: ImageDownloader 

    public func download(urlRequest: URLRequest, filter: ImageFilter?) -> Observable<UIImage> 

        return Observable.create  observer in
            let requestReceipt = ImageDownloader.default.download(urlRequest, filter: filter)  response in
                if let error = response.error 
                    observer.onError(error)
                 else if let image = response.value 
                    observer.onNext(image)
                    observer.onCompleted()
                
            
            return Disposables.create 
               requestReceipt?.request.cancel()
            
        
    

现在你可以像下面这样调用ImageDownloader.default.rx.download(urlRequest:filter:)方法

let imageRequest = URLRequest.init(url: URL(string: "https://imageserver.com/image/myimage.png")!)
let imageObservable: Observable<UIImage> = ImageDownloader.default.rx.download(urlRequest: imageRequest, filter: nil)

【讨论】:

是的,就是这样。谢谢! 更新:从 Xcode 11.3 开始,Swift 5 的 OP 代码甚至无法编译。 我几乎总是使用已经符合该协议的类型,例如UIViews。起初我完全迷失在这个错误中,但现在一切都说得通了。 :-)

以上是关于* 类型的值没有成员 'rx'的主要内容,如果未能解决你的问题,请参考以下文章

静态成员 rx 不能在实例类型 UICollectionView 上使用

“任何”的值类型没有成员 'objectforKey' Swift 3 转换

Swift 3 - 'Any?' 类型的值没有成员“valueForKey”

“String”类型的值没有成员“stringByAppendingPathComponent”[重复]

“AnyObject”类型的值没有成员年龄

Xcode 13:`'NSPersistentCloudKitContainerOptions' 类型的值没有成员'databaseScope'`