2015-05-20 21 views
17

Hi Tôi có một câu hỏi về mã này:hành Binary + không thể được áp dụng cho hai toán hạng 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) 

Phần thứ nhất đang làm việc chỉ tốt, nhưng tôi không hiểu tại sao cái thứ hai thì không. Tôi nhận được lỗi 'nhị phân nhà điều hành "+" không thể được áp dụng cho hai toán hạng int', mà với tôi không làm cho nhiều ý nghĩa. Ai đó có thể giúp tôi với một số lời giải thích?

+0

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

Trả lời

15

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 
} 
+0

Liệu có ý nghĩa gì khi sử dụng (Int) someString trong mọi tình huống. Tôi chỉ bị lẫn lộn bởi các mô tả lỗi mà tôi nhận được rằng các toán hạng là Int, có nghĩa là chiều cao bằng cách nào đó được đúc thành Int. –

+1

Không, trước tiên, đó không phải là cú pháp để truyền trong Swift (bạn sẽ sử dụng một dạng 'as', xem https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html). Thứ hai, các thông báo lỗi Swift có thói quen là khá gây hiểu lầm, vấn đề thực tế là không có 'init' trên' Int' nhận 'String'. – ABakerSmith

+0

Giải thích tuyệt vời! Cảm ơn bạn rất nhiều! –

0

gì bạn cần điều này là:

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

Nếu bạn muốn để có được một Int từ một String bạn sử dụng toInt().

+0

Vâng, tôi biết điều đó. Nhưng ngay cả theo mô tả lỗi nó có ý nghĩa để có thể thực hiện các hoạt động. Đó là bằng cách nào đó đúc chiều cao để Int. Và tôi tự hỏi tại sao lại thế. –

+0

Đó là vì bạn muốn khởi tạo một 'Int' bằng một' Chuỗi' không được phép. Bạn chỉ có thể init 'Int' với một số nguyên. Ví dụ - 'let a = Int (25)'. –

+0

Được rồi. Hiểu rồi. Cảm ơn rất nhiều! –

Các vấn đề liên quan