Lý do bạn nhận được lỗi ban đầu là trong Swift, Array
là một vùng chứa chung chứa giá trị của một loại cụ thể. Vì vậy, bạn có thể có một số Array<Int>
giữ số nguyên hoặc Array<String>
chứa chuỗi. Nhưng bạn không thể chỉ có một số Array
. Loại mảng chứa trong đó là tham số chung và Swift đang phàn nàn vì không thể tìm ra loại đó. Đôi khi nó có thể suy ra loại đó từ ngữ cảnh của mã xung quanh nó, nhưng không phải lúc nào, như trong trường hợp này.
Bạn có thể giải quyết vấn đề bằng cách cho các loại điều bạn đang lưu trữ:
IBAction func loadData(sender: AnyObject) {
if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> {
self.showDataLabel.text = toString(testCompositeArray)
}
}
Thay vì viết Array<Int>
, bạn có thể viết dưới dạng ngắn hơn, [Int]
Bạn cũng có thể giải quyết vấn đề bằng cách sử dụng NSArray
, như bạn đã tìm thấy. Không giống như Array
, NSArray
không sử dụng Generics, vì nó bắt nguồn từ Objective-C có cách tiếp cận khác với Swift. Thay vào đó, NSArray
chỉ giữ một loại điều, một số AnyObject
. Đây là một tham chiếu có thể trỏ đến các cá thể của bất kỳ lớp nào. Tuy nhiên, có một nhược điểm lớn khi sử dụng NSArray
và AnyObject
, đó là mỗi khi bạn sử dụng giá trị chúng chứa, bạn thường phải "truyền" giá trị cho một điều thực, như số nguyên hoặc chuỗi. Điều này có thể là một cơn đau, và tệ hơn, đôi khi có thể gây ra lỗi khi bạn cho rằng bạn có một loại điều khi thực sự bạn có một thứ khác. Swift thường khuyến khích bạn cụ thể hơn về các loại để tránh các lỗi như thế này.
Nguồn
2015-05-21 18:42:50
Câu trả lời hay, giúp tôi nắm bắt khái niệm Generics ... Cuối cùng! – DogCoffee