Протокол с вычисленными свойствами - PullRequest
0 голосов
/ 04 декабря 2018

Есть ли конкретная причина, по которой swift ограничивает нас от предоставления вычисляемых свойств в объявлении protocol?Поскольку у нас есть только возможность установить эти вычисленные свойства как extension в protocol.

Words -> code:

Почему это не работает- (в чем логика этого)

protocol GridableGraph {

    var yTick: Float { get }
    var yTicksCount: Int { get }

    var xTick: Float{ get }
    var xTicksCount: Int { get }

    var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
    var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

Хотя это так

protocol GridableGraph {

    var yTick: Float { get }
    var yTicksCount: Int { get }

    var xTick: Float{ get }
    var xTicksCount: Int { get }
}

extension GridableGraph{
    var maxYValue: Float { return Float(yTicksCount - 1) * yTick }
    var maxXValue: Float { return Float(xTicksCount - 1) * xTick }
}

Пожалуйста, не переписывайте то, что я только что сказал, предоставив мне некоторую документальную цитату, которую яуже охвачено:)

1 Ответ

0 голосов
/ 04 декабря 2018

Протокол разработан для предоставления интерфейса (набора методов и свойств), но оставляет реализацию для реализующих классов.

Когда у вас есть расширение для протокола, было принято решение иметьдля этого требуется реализация, чтобы не портить код внутри библиотеки или фреймворка.

Допустим, вы хотите расширить протокол UITableViewDataSource с помощью метода, который вам нравится.Если Swift не требует реализации, что происходит со всеми UIViewControllers в UIKit, которые используют этот протокол?Технически вы можете вызвать метод, но затем получите ошибку, потому что метод не существует.

Swift решил эту проблему, потребовав реализации при расширении протокола.Таким образом, вы можете либо не реализовать его (используя реализацию по умолчанию), либо реализовать его (используя реализацию в своем классе).Это потому, что Apple хотела, чтобы Swift был максимально безопасным.

Редактировать: Вы не спрашивали, почему расширение требует реализации по умолчанию, вы спрашиваете, почему вы не можете просто установить по умолчаниюреализации в вашей protocol, но лучше поместить ее в extension.Я предполагаю, что это потому, что Swift любит сохранять согласованность, и поскольку они уже допускают реализации по умолчанию в расширениях протокола, им также может потребоваться наличие реализаций по умолчанию.

Помните, что нет ничего плохого в использованиинесколько расширений в одном файле, он даже предлагается в качестве предпочтительного способа разделения кода для лучшего обзора в Ray Wenderlich Swift Style Guide .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...