【问题标题】:Accessing a closure property of an instance in RxSwift在 RxSwift 中访问实例的闭包属性
【发布时间】:2022-01-05 20:51:10
【问题描述】:

我正在尝试深入研究 RxSwift 并找出不同的方法。我在 Github 中使用类似的代码结构实现了一些项目,如下所示。我曾经认为是命令式的方式,但我真的想知道我在 Rxswift 世界中缺少什么。

    class ViewController: UIViewController {
    
    let observableProperty = PublishSubject<Client.DelegateEvent>()

    struct Client {
        
        static var live: Self { Client(events: { stringInputFromSomeWhere in
            observableProperty.asObservable() // Point 3
        }, setable: {
            { _ = SomeManager().doNothing() }
        }, someId: "cool property")}
        
        
        var events: (String) -> Observable<DelegateEvent>
        var setable: () -> ()
        var someId: String
        
        init(events: @escaping (String) -> Observable<DelegateEvent>,
             setable: @escaping () -> (),
             someId: String
            
        ) {
            self.events = events
            self.setable = setable
            self.someId = someId
        }
    
        public enum DelegateEvent {
            case didUpdate(SpecialLocation)
            case didFail(Error)
        }
        
    }
    
    struct SpecialLocation {
        
    }
    
    class SomeManager {
         func doNothing() {
            print("noThing Worked")
        }
    }
    
    override func viewDidLoad() {
      super.viewDidLoad()
        let clearStep = Client.live.someId // Point 1
        let whoAreYou = Client.live // Point 2a 
        whoAreYou.setable() // Point 2b 
        print(whoAreYou.someId)
    
    }

  • 第 1 点 - 我是在访问实例的字符串属性,对吗?

  • 第 2ab 点 - 我想,我在调用 关闭,其实我在这里做什么?

  • 第 3 点 - 出现错误,无法将 '()' 类型的值转换为闭包结果类型 'Observable' 那么我该如何解决 这有意义吗?

非常感谢您的每一个回答和评论。

【问题讨论】:

  • 没有工作项目这样做,因为它不起作用?什么项目与它“相似”?
  • 此外,Subject 提供了这个 is 命令。它们用于将命令式代码转换为 Rx 代码。
  • 最后,你的问题都与 RxSwift 无关。它们是 Swift 语言问题。

标签: swift rx-swift


【解决方案1】:

第 1 点 - 我是在访问实例的字符串属性,对吗?

严格来说是的,但实例将仅为此访问而创建,然后立即销毁。做 IMO 是相当愚蠢的。

Point 2ab - 我想,我是在调用闭包后访问一个实例,其实我在这里做什么?

第 2a 点创建一个客户端值(与第 1 点中使用的不同,但它将具有相同的值。)

点 2b 调用 setable() 的值。值对象将在 viewDidLoad 函数结束时销毁。

第 3 点 - 出现错误,无法将类型 '()' 的值转换为关闭结果类型 'Observable'

Client.live 计算属性是一个全局属性,您尝试从该全局内部访问特定 ViewController 的实例变量,但无法定义应该访问哪个实例。

那么我该如何以有意义的方式解决这个问题?

这个问题我无法回答,因为我不知道在这种情况下“固定”是什么意思......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多