1) Mã đầu tiên hoạt động vì String
có phương thức init mất Int
. Sau đó, trên dòng
let widthLabel = label + String(width)
Bạn đang concatenating các dây, với các nhà điều hành +
, để tạo ra widthLabel
.
2) thông báo lỗi Swift có thể khá sai lầm, vấn đề thực tế là Int
không có một phương pháp init
mà phải mất một String
. Trong trường hợp này, bạn có thể sử dụng phương thức toInt
trên String
. Dưới đây là một ví dụ:
if let h = height.toInt() {
let heightNumber = number + h
}
Bạn nên sử dụng và if let
tuyên bố để kiểm tra String
có thể được chuyển đổi sang một Int
từ toInt
sẽ trở lại nil
nếu nó không thành công; lực lượng unwrapping trong tình huống này sẽ sụp đổ ứng dụng của bạn. Xem ví dụ sau đây về những gì sẽ xảy ra nếu height
không chuyển đổi thành một 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 Cập nhật:
Int
hiện nay có một initialiser mà phải mất một String
, làm ví dụ 2 (xem bên trên):
if let h = Int(height) {
let heightNumber = number + h
}
Xem thêm câu trả lời cho [câu hỏi này] (http: //stackoverflow.com/questions/40557214/swift-operator-throwing-error-on-two-ints). Về cơ bản, nếu A đã được khai báo là một đôi của CGFloat hoặc bất cứ điều gì, và B và C là số nguyên, A = B + C sẽ thất bại với thông báo lỗi này, che khuất vấn đề thực sự và giải pháp: A = Double (B + C) . Câu hỏi/câu trả lời này nằm ở đầu tìm kiếm của Google về lỗi này; trong một số trường hợp, câu trả lời của câu hỏi khác có thể hữu ích hơn. – ConfusionTowers