2016-02-05 2 views
1

Я пытаюсь узнать Свифт и она оказывается более отличается от других языков, чем я ожидал ...Присвоение значения текстового поля к переменной в Swift

Я просто хочу, чтобы сохранить значение пользовательского ввода как целое число в переменной.

Мои попытки привести к следующей ошибке: «фатальная ошибка: неожиданно нашли ноль в то время как разворачивание необязательное значение»

Я попытался это несколькими способами, и не могу придумать решение, я знаю, должен быть простой способ сделать это.

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) 
    } 
} 
} 

Я знаю, что приведенный выше код неправильный, но я думаю, что это самое близкое к правильному, что я пришел. Кажется, что мне что-то не хватает, пока не разворачивается. Я понимаю принцип развертывания, но ничто из того, что я пробовал, не скомпилируется, или если оно скомпилируется, то он не с ошибкой выше, когда код инициируется (код запускается при нажатии кнопки).

Благодарим вас за помощь!

ответ

1

Пара мыслей:

  1. Убедитесь, что ваша розетка подключена к txt_Number. Вся эта проверка кода, чтобы убедиться, что это не nil, не требуется, если (а) это розетка, которую вы подключили в IB; и (б) вы не выполняете вышеуказанный код до того, как представление полностью загружено (т. е. был вызван viewDidLoad).

    Если розетка не подключена, вы увидите пустую точку на левом поле:

    enter image description here

    Если подключен правильно, вы увидите заполненную точку на левое поле:

    enter image description here

  2. Если все подключено правильно, вы можете просто сделать:

    guard let txtData = txt_Number.text, let value = Int(txtData) else { 
        // report error and then `return` 
        return 
    } 
    
    intNumber = value 
    
  3. Если вы хотите получить фантазии, вы можете захотеть, чтобы обеспечить пользователю вводит только числовые значения

    • В viewDidLoad, указать, что клавиатура только для десятичных чисел.

      txt_Number.keyboardType = .NumberPad 
      

      Или вы также можете указать это в IB.

    • Укажите делегат для текстового поля и разрешите им вводить числовые значения. (Это может показаться излишней на основе предварительной точки, но это не так, потому что вы должны также предвидеть их вставив в строке в текстовом поле.)

    См https://stackoverflow.com/a/26940387/1271826.

+1

Лучше сказать ему использовать 'intNumber = Int (txtData) ?? 0', поэтому мы можем предотвратить вопрос о дополнительной ошибке :). – Eendje

+0

@Eendje - Согласен. Или используйте оператор 'guard', который соответствующим образом присваивает значение. – Rob

0

Вы попробовали?

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

ADD:

Int() функция возвращает Optional. Если вы уверены, что значение является правильным, вы можете заставить разворачивания с помощью ! в конце имени переменной (если вы используете его), в противном случае просто поставить знак вопроса ?

+0

я, я получаю следующее сообщение об ошибке: «? Int» Значение дополнительного типа не разворачивается; вы хотели использовать '!' или '?'? –

+0

'Функция Int()' возвращает 'Optional'. Если вы уверены, что значение верное, вы можете принудительно развернуть, используя '!' В конце имени переменной (когда вы его используете), иначе просто поместите знак вопроса '?' –

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 
} 

СОВЕТ: Вы должны развернуть txt_Number.text и Int(text) отдельно. Причина Int(text) должна иметь неопровержительный аргумент.

0

попытался ниже код, чтобы присвоить значение TextField для переменной типа поплавка и все ошибка исчезнет, ​​как магия

@IBOutlet weak var txtamount: UITextField! 
@IBOutlet weak var txtrate: UITextField! 
@IBOutlet weak var txtyear: UITextField! 

@IBOutlet weak var lblresult: UILabel! 
@IBAction func btncalculate(_ sender: UIButton) 
{ 
    print("button is clicked") 
    var amount,rate,year,answer : Float 

    amount = Float(txtamount.text!)! 
    rate = Float(txtrate.text!)! 
    year = Float(txtyear.text!)! 

    answer = (amount * rate * year)/100.0 
}