2016-11-26 23 views
22

Khi cố gắng thực thi khối mã này trong Swift 3, tôi gặp lỗi: toán tử nhị phân '/' không thể áp dụng cho hai toán hạng 'Đôi' ​​toán tử nhị phân '/' không thể áp dụng cho hai toán hạng 'Đôi' ​​

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Double(value)/2.0 
} 

Tuy nhiên, công trình này

var array2 = [Double]() 
array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2.0 
} 

Tại sao không phải là khối đầu tiên của công việc mã?

Trả lời

26

Lỗi này gây hiểu nhầm một chút.

Trong bộ mã đầu tiên, array2 được khai báo hoàn toàn dưới dạng mảng Int. Vì vậy, bất kỳ nỗ lực nào để chỉ định giá trị cho chỉ mục của array2 sẽ yêu cầu giá trị Int.

Vấn đề là Double(value)/2.0 dẫn đến giá trị Double, không phải là Int. Vì vậy, trình biên dịch đang tìm kiếm phiên bản / trả về số Int. Và phiên bản đó dự kiến ​​có hai thông số Int. Vì bạn đang cung cấp hai thông số Double, bạn nhận được lỗi được đề cập trong câu hỏi của mình.

Giải pháp là đưa kết quả vào một số Int hoặc sử dụng hai thông số Int để /.

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = Int(Double(value)/2.0) // cast to Int 
} 

hoặc

var array2 = [8, 7, 19, 20] 

for (index, value) in array2.enumerated() { 
    array2[index] = value/2 // Use two Int 
} 

Kết quả sẽ được như vậy trong trường hợp này. 8 sẽ được thay thế bằng 4. 7 sẽ được thay thế bằng 3, v.v.

Bộ mã thứ hai hoạt động vì bạn khai báo mảng được điền với Double để mọi thứ khớp với đúng loại.

+0

Great câu trả lời, cảm ơn bạn. –

+1

Yêu các lỗi trình biên dịch Swift gây hiểu lầm:/ – shelll

+1

Lưu ý rằng 'Int (...) 'is * not * a cast - bạn không thể cast giữa các kiểu số khác nhau trong Swift. Đó là một * chuyển đổi * thông qua việc sử dụng trình khởi tạo 'Int'. – Hamish

2

Đối với người đầu tiên, mảng của bạn là loại Int do đó làm array2.enumerated() mang đến cho bạn value như một Int. Khi bạn làm điều này với nó, Double(value)/2.0, kết quả cuối cùng được trả về là loại Double không tương thích với loại mảng của bạn.

Đối với một thứ hai mặc dù, bạn khai báo rõ ràng một mảng của Double do đó array2.enumerated() lợi nhuận value như một Double để thực hiện các hoạt động làm việc tốt.

1

câu trả lời của rmaddy là chính xác về lý do bạn gặp sự cố, khai báo Int ngầm định. Vì lợi ích của sự hoàn chỉnh. Có một vài cách để khắc phục điều này, đúc là một; một trường hợp khác chưa được đề cập ở đây là mở rộng Double để bao gồm trường hợp này, nếu bạn cần thực hiện đủ điều này, bạn có thể chỉ định phiên bản Double/Int của riêng mình và kiểm soát cách Swift xử lý nó trong chức năng của riêng bạn.

extension Double { 
    static func/(left: Double, right: Int) -> Double { 
     return left/Double(right) 
    } 
} 

Bạn luôn có thể bổ sung thêm chức năng xử lý các trường hợp ngược lại một Int/đôi, vv ...

+0

Có điều gì đó mới mẻ! Làm thế nào để sử dụng? – Hemang

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