2015-09-02 18 views
9

Tôi đang gặp phải lỗi mà tôi không chắc chắn nếu đó là giới hạn của ngôn ngữ Swift hoặc lỗi. Đây là tiền đề cơ bản nhất:Phân lớp Swift Generic Class với sự thừa kế NSObject

class GenericClass<T> : NSObject { 

    var inputValue: T 

    init(value: T) { 
     self.inputValue = value 
     super.init() 
    } 
} 

class SubClass : GenericClass<String> { 

    override init(value: String) { 
     super.init(value: value) 
     } 

    } 

var test = GenericClass(value: "test") //Succeeds 
var test2 = SubClass(value: "test2") //Fails with EXC_BAD_ACCESS 

Tôi không nhận được cảnh báo trình biên dịch ở đây, nhưng Lớp con từ chối khởi tạo. Tôi có một mục tiêu phức tạp hơn trong việc phân lớp các bối cảnh cụ thể của một chung chung, nhưng vấn đề cơ bản ở trên là những gì tôi đã đun nó xuống.

Thật thú vị, nếu tôi loại bỏ thừa kế NSObject trên GenericClass (và super.init() từ phương thức init chung), thiết lập này hoạt động mà không có vấn đề, vì vậy tôi nghĩ rằng nó phải liên quan đến thực tế mà tôi đang kế thừa từ NSObject. Việc thực hiện đầy đủ của tôi PHẢI kế thừa từ một NSOperation (về cơ bản tôi đang tạo các lớp NSOperation tùy chỉnh với một siêu lớp chung), vì vậy kế thừa từ NSObject (tức là NSOperation) không phải là tùy chọn cho tôi.

Thật khó chịu khi không có lỗi trình biên dịch và tôi nhận được thứ gì đó khó chịu như EXC_BAD_ACCESS. Nó làm cho tôi nghĩ rằng có lẽ đây là nghĩa vụ phải làm việc, nhưng không phải là hiện tại. Tôi biết họ chỉ mới bắt đầu hỗ trợ các lớp con của các lớp chung trong Swift. Tôi đang chạy phiên bản beta xCode mới nhất 6.

Bất kỳ thông tin chi tiết nào được đánh giá cao!

Trả lời

2

Tôi chắc chắn đó là lỗi. Điều thú vị là tất cả mọi thứ hoạt động tốt nếu bạn xóa initializers, ngay cả khi bạn thừa hưởng từ NSObject:

class GenericClass<T> : NSObject { 

} 

class SubClass : GenericClass<String> { 

} 

var test : GenericClass<Int> = GenericClass() // Succeeds 
var test2 = SubClass() // Succeeds 
var test3 : GenericClass<String> = SubClass() // Succeeds 
var test4 : GenericClass<Int> = SubClass() // Fails ("cannot convert SubClass to GenericClass<Int>") 

Một cách giải quyết lộn xộn có thể được sử dụng triển khai giao thức mặc định, và sau đó mở rộng NSOperation để khởi tạo một hoạt động mới từ giao thức của bạn, nhưng có thể tốt hơn là chỉ cần gửi báo cáo lỗi và chờ họ sửa lỗi này :)

+0

Cảm ơn câu trả lời Aaron. Tôi đồng ý, nó có mùi như một con bọ. Tôi đã gửi báo cáo lỗi. Chúng tôi sẽ xem điều gì xảy ra :) Sẽ cung cấp cho ý tưởng giao thức của bạn một shot trong thời gian chờ đợi. – erendiox

+0

Vâng, tôi tin rằng đây thực sự là một lỗi. Nó bây giờ đã được sửa trong Swift 3, và không có đề cập đến nó trong Swift 3 Language Changes: https://swift.org/blog/swift-3-0-released/ – ganzogo

1
import Foundation 

class GenericClass<T> : NSObject { 

    var inputValue: T 

    init(value: T) { 
     print(value) 
     inputValue = value 
     super.init() 

    } 
} 

class SubClass<T> : GenericClass<T> { 

    override init(value: T) { 
     super.init(value: value) 
    } 

} 

let test = GenericClass(value: "test") //Succeeds 
test.inputValue 
let test2 = SubClass(value: "test2") //Succeeds 
test2.inputValue 
let test3 = GenericClass(value: 3.14) //Succeeds 
test3.inputValue 
let test4 = SubClass(value: 3.14)  //Succeeds 
Các vấn đề liên quan