2014-07-12 22 views
6

Tôi đang theo hướng dẫn của WWDC 2014 408: Sân chơi Swift sử dụng XCode Beta 3 (30 phút). Cú pháp Swift đã thay đổi kể từ bản Beta 2.Loại và chỉ số tùy chọn Swift Array (Beta 3)

var data = [27, 46, 96, 79, 56, 85, 45, 34, 2, 57, 29, 66, 99, 65, 66, 40, 40, 58, 87, 64] 

func exchange<T>(data: [T], i: Int, j: Int) { 
    let temp = data[i] 
    data[i] = data[j] // Fails with error '@lvalue $T8' is not identical to 'T' 
    data[j] = temp  // Fails with error '@lvalue $T5' is not identical to 'T' 
} 

exchange(data, 0 , 2) 
data 

Tại sao tôi không thể sửa đổi mảng nguyên có thể thay đổi theo cách này?

Trả lời

10

Vì thông số chương trình con được xác định ngầm định với let do đó, không thể thay đổi. Hãy thử thay đổi việc kê khai để:

func exchange<T>(inout data: [T], i: Int, j: Int) { 

và gọi to:

exchange(&date, 0, 2) 

Bạn cũng có thể sử dụng var nhưng điều đó sẽ chỉ cho phép các mảng phải được sửa đổi trong chương trình con. Sự thay đổi lớn cho phiên bản beta 3 là làm cho mảng thực sự vượt qua giá trị thay vì chỉ là loại sorta vượt qua giá trị một số thời gian, nhưng không phải là phần còn lại.

+0

Đã giải quyết được điều đó, cảm ơn. –

2

@David câu trả lời là chính xác, hãy để tôi giải thích lý do tại sao: mảng (cũng như từ điển và chuỗi) là các loại giá trị (cấu trúc) và không phải loại tham chiếu. Khi một kiểu giá trị phải được chuyển đến một hàm, một bản sao của nó được tạo ra và hàm đó hoạt động trên bản sao đó.

Bằng cách sử dụng công cụ sửa đổi inout, mảng ban đầu được chuyển thay vào đó, vì vậy trong trường hợp đó, bạn có thể thực hiện thay đổi trên đó.

+0

Tôi có một câu hỏi. Ví dụ, tôi có một đối tượng bao gồm một mảng. Và tôi vượt qua đối tượng này thông qua tài sản của một UIViewController. Tôi nên làm gì để chuyển nó như một tài liệu tham khảo? –

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