2016-09-14 15 views
10

Tôi có một biến trên lớp của tôi:"bộ sưu tập rỗng đen đòi hỏi một kiểu tường minh" lỗi trên Swift3

var list = [] 

và tôi sử dụng nó trên một chức năng của lớp học của tôi:

func chargeData (data: NSArray){ 
    list = data 
} 

Nó làm việc cũng về dự án của tôi trong Swift 2.3 nhưng khi tôi đã cập nhật nó để XCode8Swift3 nó mang lại cho tôi những lỗi sau:

Empty collection literal requires an explicit type

vì vậy tôi đã thêm một thợ đúc chư vào danh sách biến tôi:

var list = [] as! NSArray 

nhưng nó mang lại cho tôi những cảnh báo sau đây:

Forced cast of 'NSArray' to same type has no effect

Tôi biết rằng một cảnh báo không phá vỡ ứng dụng nhưng tôi sẽ muốn giải quyết lỗi này theo cách thích hợp.

Có ai đó có cùng lỗi và giải quyết đúng không?

Cảm ơn trước!

+1

Bạn sẽ phải thực hiện 'var list: NSArray = []'. Không sao nếu bạn chỉ thay thế bằng một cái khác. Nhưng nó không phải là * mutable * chính nó, do đó, 'var danh sách: NSMutableArray = []' sẽ là tốt hơn tôi giả sử. – Moritz

+0

@EricAya Bạn thực sự muốn nói gì với thực tế là bản thân nó không thể thay đổi được? Tôi biết rằng mutable có nghĩa là nó có thể thay đổi giá trị của nó nhưng tôi không thực sự chắc chắn những gì bạn có nghĩa là với "mutable chính nó". –

+0

CodeDifferent giải thích nó trong câu trả lời của họ. var/let và NSArray/NSMutableArray. – Moritz

Trả lời

20

Lỗi này xảy ra kể từ khi chuyển đổi ngầm đều bị bãi bỏ, do đó bạn phải nói với trình biên dịch các loại rõ ràng (của ArrayLiteral[]):

var list: NSArray = [] 
// or 
var list = [] as NSArray 
1

Bạn đang trộn ObjectiveC (NSArray) và Swift (Array<T>). Các mục bên trong một NSArray được giả định là NSObject và các lớp con của nó, trong khi Swift không có đầu mối gì T là do mảng trống và do đó kiểu suy luận không hoạt động.

Nếu bạn khai báo nó như thế này:

var data: NSArray = [] 

sẽ có một cuộc xung đột kể từ var nghĩa có thể thay đổi trong Swift, nhưng NSArray là bất biến trong ObjC. Bạn có thể khắc phục điều đó bằng cách thay đổi nó để NSMutableArray, mà là một lớp con của NSArray:

let data = NSMutableArray() // note that we don't need var here 
          // as NSMutableArray is already mutable 

Nếu bạn muốn giữ data như Swift Array, cung cấp cho nó một kiểu:

var data = [MyDataModel]() 
// or 
var data = [AnyObject]() 

// usage: 
chargeData(data: data as NSArray) 
0

Cập nhật nhanh chóng 4 :

var array = [] as [String] 
Các vấn đề liên quan