在接触Apple内购时,发现获取内购商品的代码有的可以为nil,有的则不能为nil。
// 获取单个商品
func fetchSingleProduct() async throws -> Product? {
let productID = "内购产品D1" // 注意,要替换成实际的产品ID
let products = try await Product.products(for: [productID])
if let product = products.first {
print("Product fetched: \(product)")
} else {
print("Product not found")
}
return products.first
}
// 获取多个商品
func fetchProduct() async throws -> [Product] {
let productIDs = ["内购产品D1","内购产品ID2"] // 注意,要替换成实际的产品ID
let products = try await Product.products(for: productIDs)
if products.isEmpty { // 判断返回的是否是否为空
print("No products found")
} else {
print("Products fetched: \(products)")
}
return products
}
在上面的代码中,基本的逻辑为,配置productID,尝试通过Product.products(for:)方法来获取内购商品信息。
这里不能理解的就是,为什么获取单个商品的返回值可以为nil,而获取多个商品时不能为nil,因此当我将获取单个商品的返回值改为[Product]时:
// 获取单个商品
func fetchSingleProduct() async throws -> [Product] {}
Xcode提示报错:
Cannot convert return expression of type 'Product?' to return type '[Product]'
我将获取单个商品的返回值从products.first改为products之后,报错就消失了。
我感到困惑的是,当我填写的productIDs都是错误的话,Product.products(for:)也会返回nil,那么products或者products.first按理说都会是nil,那么没有什么区别。这样的话,返回值还应该改为[Product?]才对。
后来才想明白,那就是当Product.products(fro:)查找不到产品,返回nil时,它实际上返回的是一个[Product]数组,数组的nil就是空数组[]。
而[Product]中的元素为nil时,就是nil。
根据上面两个图就可以理解,为什么Products可以返回空数组,但是Products.firstk可能返回为nil。
因此,数组的nil实际上就是[]空数组,所以不需要添加可选类型?而数组元素的nil就是真的nil,所以必须使用可选类型。