我想知道在使用这样的代码时是否可以删除强制展开(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
}