2015-02-10 11 views
24

Tôi đang sử dụng Parse và tôi đang tạo một lớp con PFObject phù hợp với giao thức PFSubclassing! Nó được làm việc tất cả tốt, nhưng bây giờ tôi đang sử dụng Swift 1.2 và nó mang lại cho tôi lỗi này:Phương thức load() định nghĩa Objective-C class method 'load', không được phép bởi Swift 1.2

1. override class func load() { 
2.  self.registerSubclass() 
3. } 

On line 1: Phương pháp 'load()' định nghĩa phương pháp lớp Objective-C 'tải', mà không được phép bởi Swift 1.2

Bất kỳ ai cũng gặp sự cố này? Làm thế nào tôi có thể sửa chữa?

+0

Bạn đang thực sự nói 'function' thay vì 'func'? Đây có phải là một số loại Parse? – matt

Trả lời

15

Có một bài viết NSHispster về phương pháp swizzling mà chạm về vấn đề này trong bối cảnh khác nhau:

Unfortunately, a load class method implemented in Swift is never called by the runtime, rendering that recommendation an impossibility. Instead, we're left to pick among second-choice options:

  • Implement method swizzling in initialize. This can be done safely, so long as you check the type at execution time and wrap the swizzling in dispatch_once (which you should be doing anyway).

  • Implement method swizzling in the app delegate. Instead of adding method swizzling via a class extension, simply add a method to the app delegate to be executed when application(_:didFinishLaunchingWithOptions:) is called. Depending on the classes you're modifying, this may be sufficient and should guarantee your code is executed every time.

Link: http://nshipster.com/swift-objc-runtime/

-

Thông tin thêm hình thức dev diễn đàn:

Swift 1.1 allowed you to define "+load" methods with "class func load()", but they were not actually run at startup time of your app like Objective-C +load methods are. Swift 1.2 bans them to avoid the impression that this might work.

Liên kết: https://devforums.apple.com/message/1102025#1102025

-

tl; dr initialize()didFinishLaunchingWithOptions dường như là nơi đàng hoàng cho những thứ như vậy trong Swift.

+0

Câu trả lời hoàn chỉnh nhất, vì vậy tôi đánh dấu là câu trả lời chính thức! Cảm ơn người đàn ông! – txaidw

5

tôi đã nhận nó làm việc bằng cách thay thế nó bằng:

override class func initialize() { 
} 
+4

Lưu ý rằng '+ tải' và' + khởi tạo' khác nhau. '+ load' chạy vào thời điểm tải nhị phân, bất kể lớp đó được sử dụng hay không; và bạn có thể có nhiều phương thức '+ tải' - một trong mỗi thể loại ngoài một phương thức chính - tất cả đều không can thiệp lẫn nhau (thường là các phương pháp thể loại thay thế các phương thức hiện có có cùng tên). '+ initialize', mặt khác, chạy một cách uể oải khi lớp đó được nhắn tin lần đầu tiên. – newacct

+0

@newacct Bạn có biết tương đương với tải() trong Swift không? Bây giờ tôi để lại bình luận ở trên là câu trả lời bởi vì nó giải quyết vấn đề của tôi cho bây giờ – txaidw

6

Tôi gọi registerSubclass() phương pháp trong appdelegate trước Parse.setApplicationId cho mỗi lớp con của PFObject và nó hoạt động.

4

Ghi đè load()không bao giờ đã làm việc với Swift. Earier nó chỉ đơn giản là không được gọi. Tôi đã gửi một lỗi cho Apple sau đó (Bug ID 18423731), và gần đây tôi đã nhận được một phản hồi rằng vấn đề đã được giải quyết bằng cách thông báo rõ ràng cho nhà phát triển rằng điều này không được phép trong Swift.

extension UIButton { 
    // !! never called 
    override public class func load() { // Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift 1.2 
     super.load() 
     println("not called earlier anyway"); 
    } 
} 

Vì vậy .... không. Ngay cả khi tài liệu nói khác đi.

6

Hãy thử điều này:

override class func initialize() { 
    var onceToken : dispatch_once_t = 0; 
    dispatch_once(&onceToken) { 
     self.registerSubclass() 
    } 
} 

Các tài liệu Parse đã được cập nhật: https://www.parse.com/docs/ios/guide#objects-subclassing-pfobject

+1

Với nhanh chóng 1.2: http://stackoverflow.com/a/29032615/1370156 –

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