2015-05-20 13 views
17

Hallo angewendet werden, habe ich eine Frage zu diesem Code:Binäroperators + kann nicht auf zwei int Operanden

1)

let label = "The width is " 
let width = 94 
let widthLabel = label + String(width) 

2)

let height = "3" 
let number = 4 
let hieghtNumber = number + Int(height) 

Der erste Teil nur funktioniert gut, aber ich verstehe nicht, warum der zweite nicht ist. Ich erhalte den Fehler "Binärer Operator" + "kann nicht auf zwei int-Operanden angewendet werden", was für mich wenig Sinn macht. Kann mir jemand mit einer Erklärung helfen?

+0

Siehe auch die Antwort auf [diese Frage] (http: //stackoverflow.com/questions/40557214/swift-operator-throwing-error-on-two-ints). Wenn A bereits als Double von CGFloat oder was auch immer deklariert ist und B und C Ganzzahlen sind, wird A = B + C im Wesentlichen mit dieser Fehlermeldung fehlschlagen, was das eigentliche Problem und die Lösung verdeckt: A = Double (B + C) . Diese Frage/Antwort steht ganz oben in der Google-Suche nach diesem Fehler. In einigen Fällen kann die Antwort der anderen Frage hilfreicher sein. – ConfusionTowers

Antwort

15

1) Der erste Code funktioniert, weil String eine Init-Methode hat, die eine Int dauert. Dann auf der Linie

let widthLabel = label + String(width) 

Sie verketten die Saiten mit dem + Operator, widthLabel zu erstellen.

2) Swift Fehlermeldungen ziemlich irreführend sein kann, ist das eigentliche Problem Int keine init Methode hat, die eine String nimmt. In diesem Fall können Sie die toInt-Methode unter String verwenden. Hier ein Beispiel:

if let h = height.toInt() { 
    let heightNumber = number + h 
} 

sollten Sie verwenden und if let Anweisung der String zu überprüfen, um eine Int umgewandelt werden, da toInt wird nil zurück, wenn es fehlschlägt; Auspacken der Kraft in dieser Situation wird Ihre App zum Absturz bringen. Siehe das folgende Beispiel von dem, was, wenn height passieren würde, war nicht konvertierbar zu einem Int:

let height = "not a number" 

if let h = height.toInt() { 
    println(number + h) 
} else { 
    println("Height wasn't a number") 
} 

// Prints: Height wasn't a number 

Swift 2.0 Update:

Int hat jetzt eine initialiser, die eine String nimmt, so dass beispielsweise 2 (siehe oben):

if let h = Int(height) { 
    let heightNumber = number + h 
} 
+0

Macht es Sinn, in irgendeiner Situation (Int) someString zu verwenden? Ich bin nur verwirrt durch die Fehlerbeschreibung, die ich bekomme, dass die Operanden Int sind, was bedeutet, dass die Höhe irgendwie zu Int gegossen wird. –

+1

Nein, erstens ist das nicht die Syntax zum Umwandeln in Swift (Sie würden eine Form von 'as' verwenden, siehe https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html)). Zweitens haben Swift-Fehlermeldungen die Angewohnheit, ziemlich irreführend zu sein, das eigentliche Problem ist, dass es kein "init" auf "Int" gibt, das eine "Zeichenfolge" benötigt. – ABakerSmith

+0

Tolle Erklärung! Vielen Dank! –

0

Was Sie brauchen, ist dies:

let height = "3" 
let number = 4 
let heightNumber = number + height.toInt()! 

Wenn Sie eine Int von einem String Sie toInt() verwenden erhalten möchten.

+0

Ja, das weiß ich. Aber auch nach der Fehlerbeschreibung macht es Sinn, die Operation durchführen zu können. Es wirft irgendwie die Höhe auf Int. Und ich frage mich, warum ist das so? –

+0

Das ist der Fall, wenn Sie ein 'Int' mit einem' String' initialisieren wollen, was nicht erlaubt ist. Sie können "Int" nur mit einer Ganzzahl initialisieren. Zum Beispiel - 'let a = Int (25)'. –

+0

In Ordnung. Ich habs. Danke vielmals! –

Verwandte Themen