Theo tài liệu của Apple, Swift không cần thiết phải ghi đè lên bộ khởi tạo. Trong một ví dụ mã sau Bar
thừa hưởng initializer của Foo
:Tại sao Swift yêu cầu ghi đè lên trình khởi tạo được chỉ định của siêu lớp chung?
class Foo {
let value: Int
init(value: Int = 5) {
self.value = value
}
}
class Bar: Foo {
}
Ngay khi chúng tôi thêm một số generic vào Foo
như class Foo<T> {
Xcode cung cấp cho chúng ta một lỗi Initializer does not override a designated initializer from its superclass
. Có một tài liệu hoặc thảo luận tiến hóa nhanh chóng giải thích tại sao nó đang xảy ra?
Cập nhật. Dường như chung chung không phải là nguyên nhân chính gây ra yêu cầu ghi đè. Dưới đây là một tùy chọn cách xác định lớp có chung không yêu cầu ghi đè của trình khởi tạo được chỉ định:
protocol FooProtocol {
associatedtype T
}
class Foo<U>: FooProtocol {
typealias T = U
let value: Int
init(value: Int, otherValue: T) {
self.value = value
self.otherValue = otherValue
}
}
class Bar: Foo<Int> {
}
Tuy nhiên có một quan sát thú vị khác về hành vi. Xác định initializer như sau yêu cầu nguyên nhân override:
init(value: Int = 5) {
self.value = value
}
Điều điều buồn cười rằng việc thêm một tham số hơn như sau vào như định initializer nguyên nhân yêu cầu ghi đè này để biến mất:
init(value: Int = 5, otherValue: T) {
self.value = value
}
Cập nhật 2. Tôi không thể tìm thấy một lời giải thích hợp lý để hành vi này, vào thời điểm này tôi đã báo cáo nó như là biên dịch lỗi - https://bugs.swift.org/browse/SR-1375
Tôi đã thực hiện một số thử nghiệm khác và vấn đề dường như là _giá trị mặc định_. Lấy '= 5' ra khỏi các ví dụ của bạn và _none_ trong số chúng dẫn đến lỗi trình biên dịch. – matt