1

次のようなコードを使用するときに、強制的なアンラップ (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)) {
    ....
}

私が知っている 1 つの方法は、currentProductRequest の宣言を var currentProductRequest : SKProductsRequest! のように暗黙的にアンラップすることです。ただし、コンパイラは currentProductRequest が nil になることはないと考えますが、そうではない可能性があります。

強制的なアンラップが問題を引き起こすことはないことはわかっていますが (この場合)、私には醜いように思えます。currentProductRequest が nil ではないことをコンパイラに知らせて、強制的なアンラップを削除する方法があるかどうかは誰にもわかりません。

4

3 に答える 3

2

あなたidentifiersがオプションでない場合は、次の恩恵を受けることができますlazy var

lazy var currentProductRequest: SKProductsRequest = {
        let productRequest = SKProductsRequest(productIdentifiers: Set<String>(identifiers))
        productRequest.delegate = self
        return productRequest
    }()

public func requestProducts() -> Bool {
    currentProductRequest!.start()
}
于 2016-08-03T11:57:55.643 に答える
2

私が通常これを行う方法は、オプションではないオブジェクトを作成し、構成してから、パラメーターに設定することです。

var currentProductRequest : SKProductsRequest?

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

編集して追加

もう少し不自然なこれを行う別の方法があります。オプションを透過的にアンラップし、代わりにそれを返すパブリック変数を作成します。これにより、オプションを処理する必要がなくなります。

private var _currentProductRequest : SKProductsRequest?

public var currentProductRequest: SKProductsRequest = {
    return _currentProductRequest!
}()

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

しかし、これはおそらくやり過ぎです。

于 2016-08-03T11:46:58.750 に答える