我想知道在使用这样的代码时是否可以删除强制解包(Swift):
var currentProductRequest : SKProductsRequest?
public func requestProducts() -> Bool {
currentProductRequest = SKProductsRequest(productIdentifiers: Set<String>(identifiers))
currentProductRequest!.delegate = self
currentProductRequest!.start()
}
在这种情况下,currentProductRequest 将 100% 不为零;然而它是一个可选的并且在上面的上下文中编译器不知道它不会是 nil 并且它需要强制解包。 由于初始化 SKProductsRequest 永远不会产生 nil 我不能使用
if let request = SKProductsRequest(productIdentifiers: Set<String>(identifiers)) {
....
}
我知道的一种方法是像 var currentProductRequest : SKProductsRequest! 那样隐式展开 currentProductRequest 的声明。然而,这将使编译器认为 currentProductRequest 永远不会为零,但事实可能并非如此。
我知道强制解包永远不会造成问题(在这种情况下),但对我来说它看起来很丑陋。有谁知道是否有办法让编译器知道 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
}
关于swift - 防止对象初始化后强制可选解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38742630/