У меня есть некоторые классы с одинаковым поведением, все они имеют
свойства > savedPath: String
, items: [String]
, currentItem: [String]
функции > archive(with items: [String])
, unarchive()
Поэтому я создаю протокол.swift и позволяю этим классам соответствовать этому протоколу для реализации этого общего поведения. Но в моем случае я хочу:
items
— внешний только для чтения, внутренний для чтения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]
}
Вы должны удалить любую приватную функцию из протокола (поскольку это бессмысленно). Ничто не является частным внутри протокола (сеттер или функция и т. д.)
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] { /* ... */ }
}
решено и спасибо, после удаления частного из протокола, частный (набор) в классах в порядке.
так есть ли обходной путь, чтобы избежать повторения записи archive(items: [Item])
и unarchive -> [Item]
в разных классах. все items
в разных классах соответствуют Item
, но являются разными конкретными типами
Да тоже было бы круто. Пожалуйста, не забудьте принять ответ, если вы найдете это полезным.
Не помещайте ничего личного в протоколы. Следуйте этому правилу, и все будет в порядке. В чем проблема?