5

私は Swift を学ぶのが初めてなので、代わりに Swift 2 を学ぶほうがよいと判断しました。次のコード スニペットを除いて、これまでのところすべてが理にかなっています。うまくいけば、誰かが私のためにこれに光を当てることができます.

//: Playground - noun: a place where people can play
import UIKit

//Works
let possibleNumber="2"
if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
}
else {
    print("could not be converted to integer")
}

//Doesn't Work and I'm not sure why
let testTextField = UITextField()
testTextField.text = "2"
let numberString = testTextField.text  //I know this is redundant

if let num = Int(numberString) {
    print("The number is: \(num)")
}
else {
    print("Could not be converted to integer")
}

コードの最初のセクションは、Apple の Swift 2 ebook から直接引用したもので、オプションのバインディングを使用して文字列を int に変換する方法が理解できます。2 番目のコードは基本的に同じですが、文字列が UITextField の text プロパティから取得される点が異なります。コードの下部で次のエラーが発生します。

Playground の実行に失敗しました: /var/folders/nl/5dr8btl543j51jkqypj4252mpcnq11/T/./lldb/843/playground21.swift:18:18: エラー: オプションの型 'String?' の値 開封されていません。「!」を使用するつもりでしたか? また '?'?if let num = Int(numberString) {

この行を使用して問題を修正しました:

if let num = Int(numberString!) {

2 番目の例で ! が必要な理由を知りたいだけです。最初はそうではありません。問題は、テキストフィールドから文字列を取得しているという事実に関係していると確信しています。ありがとう!

4

1 に答える 1

7

違いは、最初のケースpossibleNumberではオプションの変数ではないということです。間違いなく文字列です。nil にすることはできません。

2 番目のケースでtextField.textは、オプションの文字列が返され、numberStringオプションの変数も返されます。ゼロかもしれません。

今...変換Int("")はオプションのintを返します。文字列が「abc」の場合、数値を返すことができないため、nil を返します。if let...これは、ステートメントでアンラップしているものです。

ただし、2 番目のケースでは、文字列もオプションであり、Int() はオプションを受け入れません。だからあなたはそれを強制的にアンラップしています。文字列が nil の場合、アプリがクラッシュする可能性があるため、これは危険です。

代わりにできることはこれです...

if let numberString = textFeidl.text,
    number = Int(numberString) {
    // use the number
}

これにより、最初にテキストがアンラップされ、利用可能な場合はそれが使用されます。番号を取得します。それが nil でない場合は、ブロックに入ります。

guard letSwift 2 では、ここでも関数を使用できます。

Swift 2 を使用していることがわかりました。

この方法でもできます...

func getNumber() -> Int {
    guard let numberString = textField.text,
          number = Int(numberString)
          else {
          return 0
    }

    return number
}
于 2015-07-04T17:32:29.813 に答える