Есть ли стандартный способ создания "чистой виртуальной функции" в Swift, т.е. один, который должен быть переопределен каждым подклассом и который, если это не так, вызывает ошибку времени компиляции?
Метод Swift - класс, который должен быть переопределен подклассом
Ответ 1
Нет поддержки абстрактных классов/виртуальных функций, но в большинстве случаев вы могли бы использовать протокол:
protocol SomeProtocol {
func someMethod()
}
class SomeClass: SomeProtocol {
func someMethod() {}
}
Если SomeClass не реализует someMethod, вы получите эту ошибку времени компиляции:
error: type 'SomeClass' does not conform to protocol 'SomeProtocol'
Ответ 2
У вас есть два варианта:
1. Использовать протокол
Определите суперкласс как протокол вместо класса
Pro: проверка времени компиляции, если каждый "подкласс" (а не фактический подкласс) реализует требуемый метод (ы)
Con: "Суперкласс" (протокол) не может реализовать методы или свойства
2. Утверждение в супер-версии метода
Пример:
class SuperClass {
func someFunc() {
fatalError("Must Override")
}
}
class Subclass : SuperClass {
override func someFunc() {
}
}
Pro: можно реализовать методы и свойства в суперклассе
Кон: проверка времени компиляции
Ответ 3
Еще одно обходное решение, если у вас слишком много "виртуальных" методов, заключается в том, чтобы подкласс передавал "реализации" в конструктор базового класса как объекты функции:
class MyVirtual {
// 'Implementation' provided by subclass
let fooImpl: (() -> String)
// Delegates to 'implementation' provided by subclass
func foo() -> String {
return fooImpl()
}
init(fooImpl: (() -> String)) {
self.fooImpl = fooImpl
}
}
class MyImpl: MyVirtual {
// 'Implementation' for super.foo()
func myFoo() -> String {
return "I am foo"
}
init() {
// pass the 'implementation' to the superclass
super.init(myFoo)
}
}