Swift 数组和数组元素返回nil问题
Swift 数组和数组元素返回nil问题

Swift 数组和数组元素返回nil问题

在接触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,所以必须使用可选类型。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注