1

私はSwiftが初めてで、計算機を構築する初心者向けプロジェクトを試しています。「display.text」はオプションの文字列を返し、その中の文字列値は「!」でラップ解除する必要があることを理解しています。使用する前に。

ただし、「display.text」は一度アンラップするだけで、再度アンラップすることなく複数回使用できることに気付きました。これは Swift のオプション値にも当てはまりますか? この問題に関するガイドラインはどこにありますか?

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var display: UILabel!

    var userIsInTheMiddleOfTypingANumber = false

    @IBAction func appendDigit(sender: UIButton) {
        let digit = sender.currentTitle!
        if userIsInTheMiddleOfTypingANumber {
            display.text = display.text! + digit
        } else {
            display.text = digit
            userIsInTheMiddleOfTypingANumber = true
        }
    }
4

3 に答える 3

0

!オプションに が含まれている場合に実行時例外が発生するため、一般に、( operator を使用して) オプションを強制的にアンラップすることは避ける必要がありますnil。以下は、オプションのアンラップを処理するためのいくつかのテクニックに従います。

オプションのバインディング

ラップを解除して別のオプションではない変数に同じ固有の型に割り当てる場合、「一度ラップを解除してから複数回使用する」ことができる唯一の方法であることに注意してください。

オプションのバインディングを使用すると、次のようになります。

/* Example setup */
let display: UILabel = UILabel()
let digit = "1"

/* optional binding using if-let:
   _assign_ unwrapped value (if non-nil) to 'unwrapped' */
if let unwrappedText = display.text {
    // 'unwrapped' resides in scope inside of the if-let block
    display.text = unwrappedText + digit
}
else {
    display.text = digit
}

/* optional binding using guard-let-else:
   _assign_ unwrapped value (if non-nil) to 'unwrapped' */
func foo(disp: UILabel, _ dig: String) {
    guard let unwrappedText = display.text else {
        display.text = digit
        return
    }
    // 'unwrapped' resides in scope outside of the guard-let-else block
    display.text = unwrappedText + digit
}
foo(display, digit)

Nil 合体演算子

条件付きバインディングを使用してラップされていない値を明示的に割り当てたくない場合は、安全なラップ解除のためにnil 合体演算子を利用できます。

/* nil coalescing operator */
display.text = (display.text ?? "") + digit

ただし、nil 合体演算子を準オプション バインディングの方法で使用できます。オプションがnilの場合、オプションのラップされていない値またはデフォルト値を割り当てます。

let metaUnwrapped = display.text ?? ""

ImmutablemetaUnwrappedはそのスコープ内で利用可能であり、 (代入時) の値display.text(非代入の場合) を含み、代入時のデフォルト値 (代入時)を含みnilます。上記のオプションのバインディングの例では、immutable と同じ方法で使用できます。""display.textnilmetaUnwrappedunwrapped

display.text = metaUnwrapped + digit

オプションの連鎖

これはあなたの質問とは少しずれていますが、オプションとアンラップの主題であるため、オプションのチェーンについて言及することもできます。

オプションのチェーンは、オプションのプロパティが ではない場合、一部のオプションのプロパティのプロパティにアクセスするために使用できますnil。例として、 の文字数を数えたいとしますdisplay.textが、当然のことながらオプションの.textプロパティが non-の場合のみですnil。この場合、nil 合体演算子と組み合わせたオプションの連鎖が適切な選択方法になる可能性があります。

let numCharacters = display.text?.characters.count ?? 0
    /* if text != nil, returns character count; otherwise, by
       nil coalescing operator, returns 0 /*
于 2016-02-26T11:44:22.467 に答える