如何在 SwiftUI 的 AnyPublisher 中设置元组

Posted

技术标签:

【中文标题】如何在 SwiftUI 的 AnyPublisher 中设置元组【英文标题】:How to set a tuple in a AnyPublisher in SwiftUI 【发布时间】: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,状态和错误可能更有用。即使您可以发送两个状态的元组并且永不失败。 有关在组合管道头部检查授权的更好方法,请参阅***.com/a/60418000/341994 【参考方案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

    )

【讨论】:

以上是关于如何在 SwiftUI 的 AnyPublisher 中设置元组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用 Realm

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画

如何在 SwiftUI 中创建指数

如何在 SwiftUI 中停止 Animation().repeatForever

如何在 SwiftUI 中使用 .fileimporter 保存音频文件并检索文件并在 SwiftUI 列表中显示它们的文件名?

如何在 SwiftUI 中居中裁剪图像