调用append方法无精确匹配:向字符串数组添加字符串报错
问题解决:Firestore结构体数组append报错
问题重现
尝试将Drink结构体的@DocumentID字符串ID添加到Venue结构体的字符串数组中,即使已经解包了drink的id,仍提示No exact matches in call to instance method 'append'错误。
结构体定义:
struct Venue: Codable, Identifiable { @DocumentID var id: String? var name: String var address: String? var drinks: [String]? } struct Drink: Codable, Identifiable { @DocumentID var id: String? var name: String var brand: String }
触发错误的代码:
Button { for drink in drinksServedByVenue { if let drinkID = drink.id { confirmedVenue.drinks.append(drinkID) } } }
问题原因
Venue结构体中的drinks是可选数组类型([String]?),而append是数组的实例方法,不能直接对可选值调用该方法——如果drinks当前为nil,调用append就会出错,编译器因此抛出匹配错误。
解决方案
有两种常用的处理方式:
1. 给drinks设置默认非空数组
修改Venue结构体,给drinks赋默认值,确保它永远是一个存在的数组(即使为空):
struct Venue: Codable, Identifiable { @DocumentID var id: String? var name: String var address: String? var drinks: [String] = [] // 改为非可选,默认空数组 }
之后就可以直接调用append,无需额外处理:
Button { for drink in drinksServedByVenue { if let drinkID = drink.id { confirmedVenue.drinks.append(drinkID) } } }
2. 先解包可选数组再操作
如果需要保持drinks的可选性,在调用append前先解包数组,同时处理nil的情况(比如初始化空数组):
Button { for drink in drinksServedByVenue { if let drinkID = drink.id { // 若drinks为nil,先初始化为空数组,再append confirmedVenue.drinks = (confirmedVenue.drinks ?? []) + [drinkID] // 或者用另一种写法: // if var drinks = confirmedVenue.drinks { // drinks.append(drinkID) // confirmedVenue.drinks = drinks // } else { // confirmedVenue.drinks = [drinkID] // } } } }
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

