Я узнаю все о быстроте, ООП и ПОП. Я смешивал их вместе, чтобы создать абстрактный базовый класс, когда столкнулся с неожиданным поведением. Лучше всего это выражается в коде, я покажу, как он работает, как и ожидалось, а затем неожиданно (по крайней мере, для меня). Код длинный, но простой. Здесь он работает правильно:
protocol GodsWill { func conforms() }
extension GodsWill { func conforms() { print("Everything conforms to God's Will") } }
class TheUniverse: GodsWill { func conforms() { print("The Universe conforms to God's Will") } }
class Life: TheUniverse { override func conforms() { print("Life conforms to God's Will") } }
class Humans: Life { override func conforms() { print("Though created by God, Humans think they know better") } }
let universe = TheUniverse()
let life = Life()
let humans = Humans()
universe.conforms()
life.conforms()
humans.conforms()
print("-------------------------")
let array:[GodsWill] = [universe,life,humans]
for item in array { item.conforms() }
И вот результат:
The Universe conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better
-------------------------
The Universe conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better
Это именно то, что я подозревал. Но я столкнулся с этой проблемой в своем приложении, когда в первом классе не было специальной реализации конформов(), например:
protocol GodsWill { func conforms() }
extension GodsWill { func conforms() { print("Everything conforms to God's Will") } }
class TheUniverse: GodsWill { }
class Life: TheUniverse { func conforms() { print("Life conforms to God's Will") } }
class Humans: Life { override func conforms() { print("Though created by God, Humans sometimes think they know better") } }
let universe = TheUniverse()
let life = Life()
let humans = Humans()
universe.conforms()
life.conforms()
humans.conforms()
print("-------------------------")
let array:[GodsWill] = [universe,life,humans]
for item in array { item.conforms() }
Обратите внимание, что TheUniverse не имеет пользовательской реализации конформов(). Вот результат:
Everything conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better
-------------------------
Everything conforms to God's Will
Everything conforms to God's Will
Everything conforms to God's Will
Первые три строки print() — это именно то, что я ожидаю и хочу, но последние три меня действительно сбивают с толку. Так как const() является требованием протокола, они должны быть идентичны трем верхним строкам. Но я получаю поведение, как будто в расширении протокола реализована функция соответствия(), но она не указана в качестве требования протокола. В справочнике по языку программирования Swift об этом ничего нет. И это видео WWDC ровно в 30:40 доказывает мою точка.
Итак, я сделал что-то не так, неправильно понял функциональность или нашел ошибку в Swift 3?