4

私は Swift を学ぼうとしていますが、予想以上に他の言語とは違うことがわかりました...

ユーザーの入力値を整数として変数に格納したいだけです。

私の試行の結果、次のエラーが発生します:「致命的なエラー: オプションの値のラップ解除中に予期せず nil が見つかりました」

私はこれを複数の方法で試しましたが、解決策が思いつかないようです。これを行う簡単な方法が必要であることはわかっています。

var intNumber: Int = 0
@IBOutlet weak var txt_Number: UITextField!

for view in self.view.subviews as [UIView]{
if let txt = view as? UITextField
{
    if let txtData = txt.text where txtData.isEmpty
    {
        // Error Message
    }
    else
    {
        intNumber = Int(txt_Number.text)
    }
}
}

上記のコードが正しくないことはわかっていますが、それが最も正しいと思います。アンラップに関する限り、何かが欠けているようです。アンラップの原則は理解していますが、試したものは何もコンパイルされません。または、コンパイルされた場合、コードが開始されたときに上記のエラーで失敗します (コードはボタンが押されたときに開始されます)。

助けてくれてありがとう!

4

4 に答える 4

1

subviewsまず、直接参照がある場合は反復する必要はありませんtxt_Numberが、これは質問の本質ではありません。

if letセマンティクスにより、オプションの括弧内をアンラップできる{}ため、ここで最も目に見える解決策は次のとおりです。

if let unwrappedString = txt_Number.text {
    if let unwrappedIntegerInit = Int(unwrappedString) {
        intNumber = unwrappedIntegerInit
    }
}

遊び場からの私の完全な例:

var intNumber: Int = 0
var txt_Number: UITextField = UITextField()
txt_Number.text = "12"

if let unwrappedString = txt_Number.text {
    if let unwrappedIntegerInit = Int(unwrappedString) {
        intNumber = unwrappedIntegerInit
    }
}

print(intNumber)

または、関数内でガードを使用できます。

func parse() {
    guard let text = txt_Number.text, let number = Int(text) else { return } // no text
    intNumber = number
}

ヒント: unwrap する必要がtxt_Number.textあり、Int(text)個別に原因Int(text)にはオプションではない引数が必要です。

于 2016-02-05T09:07:11.693 に答える
0

これで試しましたか?

if let txtData = txt.text where !txtData.isEmpty
{
    intNumber = Int(txtData)
}
else
{
    // Error Message
}

追加:

Int()関数は を返しますOptional。値が正しいと確信している場合は!、変数名の最後で (使用している場合) を使用してアンラップを強制できます。それ以外の場合は、疑問符を付けます。?

于 2016-02-05T08:45:15.183 に答える