swift - 防止对象初始化后强制可选解包

标签 swift swift2 forced-unwrapping

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

相关文章:

ios - 如何从动态 UITableView 单元格中获取 UILabel 的大小?

swift - 我们如何使用 TapGesture 在 Tvos 中播放视频

swift - 强制解包的目的

ios - 转换为字符串的任何对象

IOS/swift :syntax to return custom object in closure

ios - UITableView单元格大小

ios - applyImpulse on SKSpriteNode in touchesBegan 不工作

ios - 扩展保存特定元素类型的快速数组

ios - 在 Swift 中获取嵌套包装变量的值

swift - 如何在swift中理解 `!`和 `?`?