2015-03-13 14 views
32

Vì vậy, tôi vừa nâng cấp lên Xcode 6.3 Beta 3 và rất nhiều lỗi (s) đang xuất hiện liên quan đến những điều sau đây:Initializer không ghi đè lên một initializer được từ nó lớp cha

Initializer không áp đảo khởi tạo được chỉ định từ lớp cha của nó.

override init() { 
    super.init() 
} 

Ví dụ này là một lớp UIButton:

class CustomButton: UIButton { 

    var target: AnyObject! 
    var selector: Selector! 
    var action: (() -> Void)! 

    override init() { // Initializer does not override a designated initializer from its superclass 
     super.init() // Must call a designated initializer of the superclass 'UIButton' 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 
} 

Đây là một trong UIViewController lớp học của tôi:

class CustomAlertView: UIViewController { 

    required init(coder aDecoder: NSCoder) { 
     fatalError("NSCoding not supported") 
    } 

    required override init() { // Initializer does not override a designated initializer from its superclass 
     super.init() // Must call a designated initializer of the superclass 'UIViewController' 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 
} 

Trả lời

39

Giải pháp của tôi là một giải pháp khắc phục nhanh, nhưng tôi nghĩ là dễ dàng hơn những gì Apple nhắm vào Ghi chú Phát hành. Để biết thêm thông tin, hãy tìm kiếm 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf tại đây. Những gì Apple nói là bạn tạo một tệp Objective-C và mở rộng nó (phải thêm nó vào các tệp tiêu đề và tất cả) và nó nằm trên "Các vấn đề đã biết trong Xcode 6.3 beta 3", vì vậy tôi nghĩ là dễ làm những gì tôi đã làm :

Đây là cách tôi cố định nó cho UIButton:

class CustomButton : UIButton { 
    init() { 
     super.init(frame: CGRectZero) 
    } 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Và đây là một trong ViewControllers tôi (loại bỏ công cộng nếu không cần thiết):

public class GenericViewController: UIViewController { 
    public init() { 
     super.init(nibName: nil, bundle: nil) 
    } 

    required public init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

tôi không sử dụng IB nên Tôi cũng có UIView, vì tôi tách chế độ xem khỏi viewController (loại bỏ công cộng nếu không cần thiết):

public class GenericMenuView: UIView { 
    public init() { 
     super.init(frame: CGRectZero) 
    } 

    public required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

tôi cần điều này đặc biệt trong quan điểm bởi vì tôi có một phương pháp setupViews mà tôi ghi đè trong tất cả các lớp con được kêu gọi init. Và bằng cách sử dụng AutoLayout, tôi không cần bất kỳ khung nào (vì vậy tôi không ghi đè init bằng tham số khung).

Vì vậy, có vẻ như bạn phải thả override. Oh! và đảm bảo không gọi số self.init() hoặc lớp học không bao giờ được khởi chạy (và nó sẽ bị treo sau một số thời gian chờ nội bộ).

1

Gần đây tôi figured này ra và tôi muốn giải thích vấn đề là gì. Được trả lời lần đầu trên Apple Developer forums.

Có vẻ như Swift đã thay đổi chiến lược để kiểm tra phụ thuộc khởi tạo hoặc để khởi tạo bộ khởi tạo.

Bây giờ nếu initializers của mình có được như hình, một cách để đối phó với cả hai Xcode 6.3 Beta 2 và Beta 3 là để loại bỏ tất cả các định nghĩa initializer:

class CustomButton: UIButton { 

    var target: AnyObject! 
    var selector: Selector! 
    var action: (() -> Void)!  
} 

class CustomAlertView: UIViewController { 

} 

Nếu không xác định bất kỳ initializers định, các lớp kế thừa toàn bộ initializers của các siêu lớp của họ.

Một bản sửa lỗi khá dễ dàng, nhưng một bản ghi nhớ lớn đã khiến tôi bối rối một lúc.

3

Theo tài liệu của Apple here, nội dung bạn ghi đè là trình khởi tạo tiện lợi. Vì vậy, đối initializer của bạn để làm việc, bạn sẽ phải thay đổi phương pháp để

override convenience init() { 
    super.init() 
} 

Bạn có thể làm điều đó, hoặc loại bỏ các initializer nếu bạn không thực sự sử dụng nó trừ gọi initializer lớp cha.

+0

Có nó nên , câu trả lời đã chỉnh sửa để rõ ràng – lostInTransit

3

Tôi nghĩ đây là cách dễ dàng hơn dường như.

Đối với một SKSpriteNode, tôi đã làm điều này:

override init() { 
    let texture = SKTexture(imageNamed: "bgTile") 
    super.init(texture: texture, color: nil, size: texture.size()) 
} 

Vấn đề là init() không phải là khởi tạo dành riêng cho SKSpriteNode. Vì vậy, tôi chỉ thay đổi nó thành:

override init(texture: SKTexture!, color: UIColor!, size: CGSize) { 
    let texture = SKTexture(imageNamed: "bgTile") 
    super.init(texture: texture, color: nil, size: texture.size()) 
} 

Bây giờ nó hoạt động tốt.

1

Giải pháp cho Lỗi: Override init (coder aDecoder: NSCoder) không làm việc như mong đợi - Swift

này làm việc cho tôi, Hãy thử điều này, Lưu ý: u phải tỉnh táo nib

override func awakeFromNib() { 

    super.awakeFromNib() 
    // Initialisation code 

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