2015-05-21 14 views
34

Tôi đang cố lưu một mảng với NSUserDefaults và sau đó tải mảng, nhưng tôi nhận được lỗi "đối số cho tham số chung không thể suy ra." Có điều gì tôi đang làm sai? Không ai có thể gặp vấn đề này nhanh chóng, vì vậy tôi không thể tìm thấy bất kỳ giải pháp nào.cho tham số chung không thể được suy ra

IBAction func loadData(sender: AnyObject) { 
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {   
     self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array 
    } 
} 

Trả lời

58

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 NSArrayAnyObject, đó 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.

+1

Câu trả lời hay, giúp tôi nắm bắt khái niệm Generics ... Cuối cùng! – DogCoffee

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