我想知道在使用这样的代码时是否可以删除强制展开(swift):

var currentProductRequest : SKProductsRequest?

public func requestProducts() -> Bool {
    currentProductRequest = SKProductsRequest(productIdentifiers: Set<String>(identifiers))
    currentProductRequest!.delegate = self
    currentProductRequest!.start()
}

在这种情况下,currentproductrequest将100%不是nil;但是它是可选的,在上面的上下文中,编译器不知道它不是nil,它需要强制展开。
因为初始化skproductsrequest永远不会产生nil,所以我不能使用
if let request = SKProductsRequest(productIdentifiers: Set<String>(identifiers)) {
    ....
}

我知道的一种方法是像var currentproductrequest:skproductsrequest那样隐式地声明currentproductrequest!。但是,这将使编译器认为currentproductrequest永远不会为nil,这可能不是事实。
我知道强制拆封永远不会引起问题(在这种情况下),但对我来说这看起来很难看。是否有人知道是否有方法让编译器知道currentproductrequest不是nil,从而移除强制展开。

最佳答案

在这种情况下,我更喜欢用相同的名称定义本地常量,并使用self关键字将其分配给属性,就像我们在初始化器中所做的那样:

var currentProductRequest : SKProductsRequest?

public func requestProducts() -> Bool {
    let currentProductRequest = SKProductsRequest(productIdentifiers: Set<String>(identifiers))
    self.currentProductRequest = currentProductRequest
    currentProductRequest.delegate = self
    currentProductRequest.start()
    return true
}

10-02 13:13