2017-12-28 13 views
1

Anfänger in Swift und ich habe ein frustrierendes Problem. Das Programm kompiliert korrekt und läuft ohne Das Programm soll das Alter einer Katze in Katzenjahren basierend auf vom Benutzer eingegebenen menschlichen Jahren berechnen.Nach dem Drücken des Knopfes wird jedoch das Ergebnis mit dem Wort "Operator" angezeigt, angehängt an die Katzenjahre, das durch Klammern begrenzt ist ., dh Optional(35) Hier ist mein Code:?!Warum zeigt mein Etikett "Ihre Katze ist optional (35) Jahre alt" wenn es "Ihre Katze ist 35 Jahre alt?

@IBOutlet weak var getHumanYears: UITextField! 
@IBOutlet weak var displayCatYears: UILabel! 
@IBAction func calculateCatYears(_ sender: Any) 
{ 
    if let humanYears = getHumanYears.text 
    { 
     var catYears: Int? = Int(humanYears) 
     catYears = catYears! * 7 
     let catYearsString: String = String(describing: catYears) 

     displayCatYears.text = "Your cat is " + catYearsString + " years old" 
    } 
} 

weiß jemand, was ich falsch mache Vielen Dank für Ihre wertvolle Input

+1

Sie sollten die String-Beschreibungsmethode nicht verwenden. Entpacke einfach dein optionales und benutze 'String (catYears)' –

Antwort

3

Das Problem ist hier:

String(describing: catYears) 

catYears ist ein Optional<Int>, eine Zeichenfolge, die eine Optional<Int> wird im Format von Optional(<value>) oder nil beschreibt. Deshalb erhalten Sie Optional(35).

Sie müssen catYears auspacken!

String(describing: catYears!) 

Oder entfernen String(describing:) alle zusammen und tun:

if let humanYearsText = getHumanYears.text, let humanYears = Int(humanYearsText) 
{ 
    let catYears = humanYears * 7 
    displayCatYears.text = "Your cat is \(catYears) years old" 
} 
+0

@LeoDabus Edited, ich zeige nur, wo der OP-Code falsch gelaufen ist. – Sweeper

0

Auspacken catYearsString. verwenden let catYearsString: String = String (beschreibt: catYear) displayCatYears.text = "Ihre Katze ist" + catYearsString + "Jahre"

Ausgang:

Testcode

var catYears: Int? = Int(7) 
catYears = catYears! * 7 
let catYearsString: String = String(describing: catYears!) 

print("Your cat is " + catYearsString + " years old") 

enter image description here

+1

'catYearsString' kann nicht ausgepackt werden ... Es ist kein optionales – Sweeper

+0

@LeoDabus pls check edit antwort. –

1

Wie andere erwähnt, weil var catYears: Int? = Int(humanYears) ist, so catYears ein optional. Und die String(describing: ...) für ein optionales Drucken Optional(rawValue).

Was Sie wollen, ist sicherzustellen, dass Sie den Wert haben, und nicht optional, wenn Sie es drucken. Wenn Sie 100% sicher sind, dass Sie einen Int Wert in der Zeichenfolge haben, können Sie es mit ! tun.

Ich schlage jedoch vor, dass Sie den Operator ! nicht verwenden, da dies Ihre Anwendung zum Absturz bringen wird, wenn sich Zeichen im Textfeld befinden.

if let text = getHumanYears.text, let humanYears = Int(text) 
{ 
    let catYears = humanYears * 7 
    displayCatYears.text = "Your cat is \(catYears) years old" 
} else { 
    displayCatYears.text = "I don't know!" 
} 
Verwandte Themen