2015-03-09 20 views
7

Tôi hiểu, lỗi cụ thể này đã được đăng ở đây và ở đó và mã có phần cơ bản, nhưng bản thân tôi vẫn không thể tìm ra số này & Tôi cần lời khuyên.'PFObject' không có thành viên có tên 'subscript'

Vấn đề là khi tôi thêm hai dòng đầu tiên của code provided on parse.com for saving objects

var gameScore = PFObject(className:"GameScore") 
gameScore["score"] = 1337 

tôi nhận được lỗi sau cho dòng thứ hai:

'PFObject' không có một thành viên có tên là 'subscript '

Tôi đang sử dụng Xcode 6.3 beta 2. Tất cả thư viện bắt buộc được liên kết với nhị phân, <Parse/Parse.h> được nhập qua BridgeHeader.

Tôi nên sử dụng cú pháp nào?

Trả lời

10

Điều này xảy ra do phiên bản 1.6.4 của sdse phân tích cú pháp đã thêm chú thích về tính không đọc mục tiêu-C vào khung. Đặc biệt là các tập tin Parse/PFObject.h định nghĩa:

- (PF_NULLABLE_S id)objectForKeyedSubscript:(NSString *)key;

mà gây ra Swift biên dịch lỗi. Xóa PF_NULLABLE_S khắc phục sự cố.

Mặt khác nó có vẻ đúng khi cho rằng một đối tượng cho một subscript khóa có thể nil, vì vậy tôi nghi ngờ đây là một lỗi Swift ...

+0

Bạn có ý nghĩa gì khi xóa 'PF_NULLABLE_S'? Tôi có nên, nói, bình luận '- (PF_NULLABLE_S id) objectForKeyedSubscript: (NSString *) chính;' dòng ra? –

+3

Tôi có nghĩa là thay đổi nó trong 'PFObject.h' thành: ' '' - (id) objectForKeyedSubscript: (NSString *) khóa; '' ' – kashif

+0

Cảm ơn bạn, dear sir –

1

Tôi đã chạy thành công mã chính xác của bạn.

Trước tiên, hãy chắc chắn rằng bạn đang thực sự tiết kiệm các đối tượng trong nền, sau khi bạn thiết lập giá trị mới:

gameScore.save() 

tôi sẽ kiểm tra lại cho lỗi chính tả trong tên lớp và lớp con; nếu chúng không chính xác, nó sẽ không hoạt động.

Nếu đó không phải là vấn đề, hãy xác minh trong Phân tích cú pháp rằng lớp con "điểm" được đặt thành một số. Nếu bạn vô tình thiết lập nó thành một chuỗi, thiết lập nó như là một số nguyên sẽ không hoạt động.

Nếu những đề xuất này không đạt giải pháp, thì tôi không chắc vấn đề là gì. Hy vọng tôi đã giúp.

+0

Cảm ơn bạn đã trả lời. Không, trên thực tế, chúng là hai dòng duy nhất tôi viết. Vì vậy, tôi không cố gắng tiết kiệm một cái gì đó, tôi cũng không có cơ hội để đánh vần bất cứ điều gì. Và tôi nhận được cùng một lỗi chính xác với 'gameScore [" playerName "] =" Sean Plott "' & 'gameScore [" cheatMode "] = false'. –

6

Vấn đề có vẻ là phương pháp chữ ký thay đổi, như Kashif gợi ý . Swift dường như không thể kết nối với phương thức Objective-C vì chữ ký không còn khớp với tên của phương thức subscript.

Cách giải quyết 1

Bạn có thể làm việc xung quanh này mà không sửa đổi khuôn khổ bằng cách gọi phương thức subscript trực tiếp, thay vì sử dụng [] điều hành:

Thay vì sử dụng các hướng dẫn dưới đây để nhận được giá trị của một khóa cụ thể:

let str = user["key-name"] as? Bool 

Vui lòng sử dụng t anh hướng dẫn sau đây:

let str = user.objectForKey("key-name") as? Bool 

Thay vì sử dụng các hướng dẫn dưới đây để thiết lập giá trị của một phím đặc biệt:

user["key-name"] = "Bla bla" 

Vui lòng sử dụng các hướng dẫn sau đây:

user.setObject("Bla bla", forKey: "key-name") 

Cách giải quyết 2

Một giải pháp khác là thêm một phần mở rộng trên PFObject mà thực hiện các subscript thành viên và kêu gọi setValue:forKey::

extension PFObject { 
    subscript(index: String) -> AnyObject? { 
    get { 
     return self.valueForKey(index) 
    } 
    set(newValue) { 
     if let newValue: AnyObject = newValue { 
     self.setValue(newValue, forKey: index) 
     } 
    } 
    } 
} 

Lưu ý rằng cách giải quyết thứ hai này không phải là hoàn toàn an toàn, bởi vì tôi m không chắc chắn Parse thực sự thực hiện các phương thức subscript như thế nào (có thể họ làm nhiều hơn là chỉ gọi setValue:forKey - nó đã làm việc trong các trường hợp thử nghiệm đơn giản của mình, vì vậy nó có vẻ như một giải pháp hợp lệ cho đến khi điều này được sửa trong Parse/Swift.

+0

Cảm ơn câu trả lời của bạn. Một giải pháp khác là chỉ cần đi với phiên bản ổn định của Xcode cho đến khi 6.3 là bắt buộc. Như một vấn đề của thực tế, bây giờ tôi sử dụng 6,2 như IDE chính của tôi & 6.3 beta để thích nghi với các dự án ổn định hơn của tôi để Swift 1.2. Đối với '.setObject', tôi đã xử lý mã của mình với nó vào lúc tôi tạo cuộc thảo luận này, nhưng tôi muốn chắc chắn rằng toán tử' [] 'không còn hoạt động trong Swift 1.2 nữa. –

0

Tôi gặp lỗi tương tự với Parse 1.6.4 và 1.6.5 trong tệp tiêu đề PFConstants.h với các tham số phương pháp.

Xcode 6.3 beta 4 có ghi chú trong phần "Mới trong ..." liên quan đến toán tử vô hiệu.

Di chuyển toán tử vô hiệu giữa toán tử con trỏ và tên biến dường như tuân thủ/biên dịch.

Thay đổi:

PF_NULLABLE_S NSError *error 

tới:

NSError * PF_NULLABLE_S error 

    (i.e., NSError* __nullable error) 

... giải quyết các lỗi biên dịch.

Điều này cũng làm việc cho các thông số khối được xác định bằng id. Vì thế...

PF_NULLABLE_S id object 

trở thành:

id PF_NULLABLE_S object 

Trong trường hợp trên, có lẽ:

- (id PF_NULLABLE_S)objectForKeyedSubscript:(NSString *)key; 

Tức là, các nhà điều hành nullability là sau khi loại con trỏ.

0

Tôi biết đã lâu rồi nhưng tôi gặp phải sự cố tương tự khi tôi bắt đầu ứng dụng Parse đầu tiên của mình với SDK phiên bản 1.9.1.

Hướng dẫn Quickstart có mã dưới đây là một ví dụ như thế nào để tiết kiệm giá trị:

let testObject = PFObject(className: "TestObject") 
testObject["foo"] = "bar" 
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in 
    println("Object has been saved.") 
} 

Nhưng, dòng testObject["foo"] = "bar" trả lại lỗi 'PFObject' does not have a member named 'subscript'. Tôi đã có thể giải quyết vấn đề bằng cách thay đổi dòng thành testObject.setValue("bar", forKey: "foo"). (Theo đề xuất của video hướng dẫn trên YouTube: https://www.youtube.com/watch?v=Q6kTw_cK3zY)

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