Как установить внутреннее, только для чтения внешнее свойство в протоколе

У меня есть некоторые классы с одинаковым поведением, все они имеют

свойства > savedPath: String, items: [String], currentItem: [String]

функции > archive(with items: [String]), unarchive()

Поэтому я создаю протокол.swift и позволяю этим классам соответствовать этому протоколу для реализации этого общего поведения. Но в моем случае я хочу:

  1. items — внешний только для чтения, внутренний для чтения
  2. archive/unarchive являются частными функциями

я пытался использовать private(set) перед items, private перед archive/unarchive, и появились некоторые ошибки. Есть ли гибкие решения, чтобы исправить это?

раньше без протокола

class SampleClass {
    private(set) var items: [SampleModel] {
        set {
            archive(with: newValue)
        } get {
            return unarchive()
        }
    }

    func archive(with addresses: [SampleModel]) { ... }
    func unarchive() -> [SampleModel] { ... }
}

после попытки использовать протокол для удовлетворения

protocol SampleProtocol {
    associatedtype Item: Switchable

    var savedPath: String { get }
    var items: [Item] { get }
    var currentItem: Item? { get }

    func archive(with items: [Item])
    func unarchive() -> [Item]
}

Не помещайте ничего личного в протоколы. Следуйте этому правилу, и все будет в порядке. В чем проблема?

Sweeper 29.05.2019 08:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны удалить любую приватную функцию из протокола (поскольку это бессмысленно). Ничто не является частным внутри протокола (сеттер или функция и т. д.)

protocol SampleProtocol {
    associatedtype Item: Switchable

    var savedPath: String { get }
    var items: [Item] { get }
    var currentItem: Item? { get }
}

Затем вы должны реализовать элементы управления доступом к классу следующим образом:

class SampleClass {
    private(set) var items: [SampleModel] {
        set {
            archive(with: newValue)
        } get {
            return unarchive()
        }
    }

    private func archive(with addresses: [SampleModel]) { /* ... */ }
    private func unarchive() -> [SampleModel] { /* ... */ }
}

решено и спасибо, после удаления частного из протокола, частный (набор) в классах в порядке.

shinolr 29.05.2019 09:09

так есть ли обходной путь, чтобы избежать повторения записи archive(items: [Item]) и unarchive -> [Item] в разных классах. все items в разных классах соответствуют Item, но являются разными конкретными типами

shinolr 29.05.2019 09:18

Да тоже было бы круто. Пожалуйста, не забудьте принять ответ, если вы найдете это полезным.

user11571036 29.05.2019 09:32

Другие вопросы по теме