【问题标题】:How to set a tuple in a AnyPublisher in SwiftUI如何在 SwiftUI 的 AnyPublisher 中设置元组
【发布时间】:2021-08-10 17:19:33
【问题描述】:

早安社区,

我有一个很好的问题,我尝试在一个项目中实施,但我需要结合一些新的东西 我想做一个函数来检查一些权限,但是我想返回一个 AnyPublisher 里面有一个元组,有人可以帮我做这件事或知道怎么做吗?

我把我的代码放在下面。

func returnedPermisionReminderAuthorizationStatus(reminderPermission:EKAuthorizationStatus,calendarPermission:EKAuthorizationStatus) -> AnyPublisher<(EKAuthorizationStatus,EKAuthorizationStatus),Never>{

    var reminderPermissionToPass:EKAuthorizationStatus =  .notDetermined
    var calendarPermissionToPass:EKAuthorizationStatus =  .notDetermined
    
    switch (reminderPermission){
    case .notDetermined:
      return Just(reminderPermissionToPass).eraseToAnyPublisher()
    case .restricted:
        reminderPermissionToPass = .restricted
        return Just(reminderPermissionToPass).eraseToAnyPublisher()
    case .denied:
        reminderPermissionToPass = .denied
        return Just(reminderPermissionToPass).eraseToAnyPublisher()
    case .authorized:
        reminderPermissionToPass = .authorized
        return Just(reminderPermissionToPass).eraseToAnyPublisher()
    @unknown default:
        reminderPermissionToPass = .notDetermined
        return Just(reminderPermissionToPass).eraseToAnyPublisher()
    }

}

是否可以在just中发送一个元组?

【问题讨论】:

  • 用 Just 传递一个元组是完全可以的。但是在您的代码中,您返回的是单个 EKAuthorizationStatus 值,而不是元组(该函数期望返回一个元组)。更改它们以返回一个元组,例如 Just((.notDetermined, .notDetermined)).eraseToAnyPublisher 或任何它应该用于该案例的内容。
  • 利用Error 类型而不是发送一个元组。例如,您可以在authorized 上发送true,在notDetermined 上发送false 并在其他情况下发送错误。
  • 同意@vaidan,状态和错误可能更有用。即使您可以发送两个状态的元组并且永不失败。
  • 有关在组合管道头部检查授权的更好方法,请参阅stackoverflow.com/a/60418000/341994

标签: swift swiftui combine


【解决方案1】:

您可以像这样从Just 发送一个元组:

func returnedPermisionReminderAuthorizationStatus(
    reminderPermission: EKAuthorizationStatus,
    calendarPermission: EKAuthorizationStatus
) -> AnyPublisher<(EKAuthorizationStatus,EKAuthorizationStatus),Never>{
    Just((reminderPermission,calendarPermission))
        .eraseToAnyPublisher()
}

【讨论】:

    【解决方案2】:

    PassthroughSubject 怎么样?如果是,请尝试以下代码:

    let someResponse = PassthroughSubject<(Bool,String), Never>()
    

    然后接收

        .onReceive(someResponse, perform: { (boolValue,StringValue) in
    
        })
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2019-12-12
      • 2021-07-01
      相关资源
      最近更新 更多