tôi có các mã sau:Swift lớp cha chung init không thể truy cập khi xây dựng lớp con của nó
class ILProperty<T> {
var value: T?
init(_ value: T) {
self.value = value
}
}
typealias ILStringProperty = ilStringProperty<String>
class ilStringProperty<String>: ILProperty<String> {
}
let x = ILStringProperty("X")
Dòng cuối cùng là một lỗi biên dịch:
'ILStringProperty' cannot be constructed because it has no accessible initializers
Nếu tôi ghi đè lên các init:
override init(_ value: String) {
super.init(value)
}
sẽ hoạt động nhưng tôi không thích. Tại sao tôi cần ghi đè lên khi tôi không thêm/sửa đổi nó?
Tôi có làm gì sai không?
Cập nhật: Theo dõi câu hỏi để trả lời từ Nikita Leonov và Icaro
đầu tiên liên quan đến tất cả các thuộc tính phải có giá trị mặc định, tôi nghĩ là tôi hài lòng quy tắc này, nơi một var tùy chọn được mặc định với một giá trị nil, isn phải không? Mặc dù tôi viết var value: T? = nil
không giải quyết được.
Sau đó, so với cùng phần documentation "Automatic Initializer Inheritance":
superclass initializers are automatically inherited if certain conditions are met
Một điều kiện là:
If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers.
Nơi tôi nghĩ rằng các mã trên không đáp ứng. Điều này thực sự sẽ hiệu quả nếu tôi không sử dụng Generics:
class ILProperty {
var value: Any?
init(_ value: Any) {
self.value = value
}
}
class ILStringProperty: ILProperty {
}
let x = ILStringProperty("X")
Quy tắc này cũng áp dụng cho các lớp học chung?
Hm. Bạn đúng rồi. Với quy tắc này trong tâm trí nó nên kế thừa.Nó hoạt động cho lớp không chung chung, nhưng không thành công trên lớp chung - http://swiftstub.com/239455006/ Trường hợp thực sự thú vị. Tôi cũng tìm thấy câu hỏi tương tự trên diễn đàn Apple dev, nhưng chưa được trả lời - https://forums.developer.apple.com/thread/5389 –
Cảm ơn bạn đã liên kết câu hỏi tương tự – jolen