2016-03-31 1 views
0

Я пытаюсь создать некоторый код в Swift, который будет вводить пользовательский объект, из объекта UITextField, создать диапазон от этого ввода от 1 до X (введенный пользователем номер) а затем выберите случайное число из этого диапазона.Ошибка выполнения при вводе пользователя для диапазона

Я звоню мой пользовательский введенный текст как этого

var rangeInput: UInt32 { 
    get { 
     return ((rangeInputTextField?.text ?? "") as? UInt32)! // ERROR OCCURS HERE 
    } 
} 

и создание моего списка и назвав номер таким образом.

let viewController = ViewController() 
var x = ViewController().rangeInput 
let y = (UInt32?(x)) 
var number = arc4random_uniform(y!) 

//MARK: Class for random number 

struct RandomNumber { 
    // numberRange to change the value for 1...X(user input) 
    //creates the list to be picked from. (pickRandom) 
    func numberRange(high: UInt32) ->Range<UInt32>{ 

     if let high = UInt32?(0) { 
      print("Invalid number") 
     } else { 
      let high = UInt32(y!) + 1 
     } 

     let range = 1...high 
     return range 

    } 

    let pickRandom = number 
} 

и обратно в мой контроллер, я звоню внутри функции моей кнопки, как это.

@IBAction func rollButton(sender: UIButton) { 

    rolledNumber?.text = "\(RandomNumber().pickRandom)" 

    if let resignFirstResponder: Bool = resignFirstResponder() { 
     self.rangeInputTextField?.resignFirstResponder()  //Closes keyboard 
    } 
    resignFirstResponder() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

Вот что меня смущает, мой код компилируется и работает, когда я получаю в симуляторе, кажется, все в порядке, я нажимаю мой текстовое поле, и мой номер колодки тянет, и я могу ввести свой номер, но когда я нажимаю кнопку «Ролл», которую я установил, он падает. он дает мне ошибку говоря «Тема 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкодовый = 0x0)» и «Фатальная ошибка: неожиданно нашла ноль в то время как разворачивание необязательного значения» в CMD линиях

на этой линии

return ((rangeInputTextField?.text ?? "") as? UInt32)! 
+0

вы не можете бросить строку UInt32, он не дает вам нуля, но вы заставляете разворачивать и, конечно, крушить – Andrea

+0

@ Аndrea хорошо, тогда весь мой код имеет недостаток, потому что я использовал UInt32 для выбора случайного числа .. есть способ, которым я могу принять пользовательский ввод как UInt32, кроме этого? – GabrielMSC

+0

Правильный путь будет создавать UInt32 от символа. Что-то вроде этого UInt32 (строка) – Andrea

ответ

0

Я решил свою проблему, я на самом деле отказался от всего кода и создал новую структуру.

это то, что работает для меня:

struct RandomNumber { 
func getRandomNumber(x: UInt32) -> String{ 
    return String(arc4random_uniform(x) + 1) 
} 

}

все, что нужно сделать, это вызов на структуры с моей точки зрения контроллера

0

Во-первых, вы не можете наложить строку на UInt32.

Во-вторых, похоже, что вы определенно хотите вернуть номер, поэтому я не буду рекомендовать пустую строку после тройного оператора.

Попробуйте это:

return UInt32(rangeInputTextField?.text ?? "0")

Вам все еще нужно пройти в 0 в виде строки, потому что вы не можете использовать тройной оператор между двумя различными типами (String и Int), но с помощью этого вам всегда будет возвращать либо номер, введенный пользователем с помощью цифровой клавиатуры, либо 0 (или любой номер, который вы хотите вернуть по умолчанию).