gpt4 book ai didi

ios - 从Combine框架使用CombineLatest时“Extra argument”错误

转载 作者:行者123 更新时间:2023-12-02 10:49:44 24 4
gpt4 key购买 nike

问题可以在下面的操场上看到。有四个发布的值将被异步更新(一个图像和三个字符串)。当所有四个都已初始化或随后更改时,则需要更新UI。当我尝试使用CombineLatest4捕获此数据流时,编译器立即使用消息Extra argument in call反对第四个参数。 (注意:以下代码实际上没有任何作用,因为它只有发布者,但是足以在Playground中产生错误消息)。

import Combine
import UIKit

struct CustomerUpdates
{
@Published var photo: UIImage!
@Published var firstName: String!
@Published var lastName: String!
@Published var id: String!

typealias customerTuple =
( photo: UIImage,
firstName: String,
lastName: String,
id: String )
var validatedCustomer: AnyPublisher< customerTuple, Never >
{
return Publishers.CombineLatest4( $photo,
$firstName,
$lastName,
$id )
{
photo, firstName, lastName, id in
if photo == nil
|| firstName == nil
|| lastName == nil
|| id == nil
{
return nil
}
return ( photo!, firstName!, lastName!, id! )
}
.compactMap
.return( on: RunLoop.main )
}
}

我的问题是,为什么编译器会标记第四个参数(“id”)?苹果公司关于CombineLatest4通用结构的文档说:

A publisher that receives and combines the latest elements from four publishers.

最佳答案

问题在于CombineLatest没有关闭,它只是在任何上游发出新值时都发出从其所有上游发出的最新值。应该将您的闭包提供给compactMap,这是采取闭包操作返回Optional的运算符,并且如果返回值不是nil,则仅向下游发出一个值。

struct CustomerUpdates {
@Published var photo: UIImage!
@Published var firstName: String!
@Published var lastName: String!
@Published var id: String!

typealias CustomerTuple = (photo: UIImage, firstName: String, lastName: String, id: String)
var validatedCustomer: AnyPublisher<CustomerTuple, Never> {

return Publishers.CombineLatest4($photo, $firstName, $lastName, $id)
.compactMap { photo, firstName, lastName, id in
guard let photo = photo, let firstName = firstName, let lastName = lastName, let id = id else { return nil }
return ( photo, firstName, lastName, id)
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}

与您的问题无关的其他几个问题:没有此类运算符 return(on:),您需要 receive(on:),并且您想要传递 DispatchQueue.main,而不是 RunLoop.main才能将更新直接发布到您的UI。

类型名称在Swift中应为UpperCamelCase,因此请使用 CustomerTuple而不是 customerTuple

另外,您的属性应为 Optional( var photo: UIImage?),而不是隐式解包的可选( var photo: UIImage!)。

关于ios - 从Combine框架使用CombineLatest时“Extra argument”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60306102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com