2015-05-20 25 views
17

Ciao ho una domanda su questo codice:Operatore binario + non può essere applicato a due operandi int

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) 

La prima parte è in funzione solo bene, ma non capisco perché il secondo non lo è. Ricevo l'errore "Operatore binario" + "non può essere applicato a due operandi int", che per me non ha molto senso. Qualcuno può aiutarmi con qualche spiegazione?

+0

Vedere anche la risposta a [questa domanda] (http: //stackoverflow.com/questions/40557214/swift-operator-throwing-error-on-two-ints). In sostanza, se A è già dichiarato come Double di CGFloat o qualsiasi cosa, e B e C sono interi, A = B + C fallirà con questo messaggio di errore, che oscura il vero problema e la soluzione: A = Double (B + C) . Questa domanda/risposta è in cima alla ricerca di Google per questo errore; in alcuni casi, la risposta dell'altra domanda potrebbe essere più utile. – ConfusionTowers

risposta

15

1) Il primo codice funziona perché String ha un metodo init che accetta uno Int. Poi sulla linea

let widthLabel = label + String(width) 

Stai concatenazione le corde, con l'operatore +, per creare widthLabel.

2) messaggi di errore Swift può essere molto fuorviante, il vero problema è Int non ha un metodo che prende un initString. In questa situazione è possibile utilizzare il metodo toInt su String. Ecco un esempio:

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

si dovrebbe usare e if let dichiarazione per controllare la String può essere convertito in un Int dal toInt tornerà nil se non riesce; forzare lo srotolamento in questa situazione causerà il crash della tua app. Vedere il seguente esempio di cosa accadrebbe se height non era convertibile in una 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 ora ha un initialiser che prende un String, rendendo ad esempio 2 (vedi sopra):

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

Ha senso usare (Int) someString in qualsiasi situazione. Mi sto solo confondendo con la descrizione dell'errore che ottengo che gli operandi sono Int, il che significa che l'altezza è in qualche modo convertita in Int. –

+1

No, in primo luogo, questa non è la sintassi per il cast in Swift (dovresti usare una forma di 'as', vedi https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html). In secondo luogo, i messaggi di errore di Swift hanno l'abitudine di essere abbastanza fuorvianti, il vero problema è che non c'è un 'init' su' Int' che prende un 'String'. – ABakerSmith

+0

Ottima spiegazione! Grazie mille! –

0

Quello che vi serve è questo:

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

Se si desidera ottenere un Int da un String si utilizza toInt().

+0

Sì, lo so. Ma anche secondo la descrizione dell'errore ha senso essere in grado di eseguire l'operazione. In qualche modo sta gettando l'altezza su Int. E mi chiedo perché sia ​​così. –

+0

Ecco perché si desidera inizializzare un 'Int' con un' String' che non è consentito. È possibile solo iniziare 'Int' con un numero intero. Ad esempio - 'let a = Int (25)'. –

+0

OK. Fatto. Molte grazie! –