Ответ
Да, в протоколе Swift можно объявить требование для свойства, указав его имя, тип и уровень доступа (get или get set). Саму реализацию (stored или computed property) предоставляет тип, соответствующий протоколу.
// Объявление требований к свойствам в протоколе
protocol Identifiable {
var id: String { get } // Только на чтение
var displayName: String { get set } // На чтение и запись
static var typeName: String { get } // Статическое свойство
}
// Соответствие протоколу
struct User: Identifiable {
// Можно реализовать как stored property
let id: String
// Можно реализовать как computed property
var displayName: String {
get { "User_(id)" }
set { /* логика установки */ }
}
// Статическое свойство
static let typeName: String = "User"
}
Ключевые моменты:
{ get }означает, что свойство должно быть как минимум доступно для чтения. Его можно реализовать как константу (let), переменную (var) или вычисляемое свойство только для чтения.{ get set }требует, чтобы свойство было изменяемым. Его нельзя реализовать какletконстанту.- Требуемый тип должен точно соответствовать (например,
var id: String?не удовлетворит требованиюvar id: String).
Ответ 18+ 🔞
А, ну вот, опять эти протоколы в Swift, блядь! Слушай, как будто без них жизнь не мила, ёпта. Ну ладно, разберём твою писанину.
Так, значит, объявляем мы тут протокол, как какую-нибудь бумажку от начальства, где написано, что ты должен иметь. Вот, смотри, Identifiable. Чтоб тебя идентифицировали, сука, ты должен предоставить id и displayName. И всё это объявляется прям в протоколе, вот так вот, нагло.
protocol Identifiable {
var id: String { get } // Только на чтение
var displayName: String { get set } // На чтение и запись
static var typeName: String { get } // Статическое свойство
}
Видишь эту приписку { get }? Это не просто так, блядь. Это значит — «чувак, ты должен как минимум дать мне это прочитать». Можешь сделать константой (let), можешь переменной (var), можешь вычисляемым свойством, которое на ходу придумывает ответ — главное, чтоб я мог это получить. А вот { get set } — это уже посерьёзнее. Это уже «дай мне это и позволь поменять». Сюда let уже не прокатит, только var, и вычисляемое свойство должно быть с сеттером, иначе — пиздец, компилятор тебя сожрёт.
А статическое свойство static var typeName — это вообще для всех твоих собратьев-типов общее правило, блядь. Как фамилия у семьи.
Ну и пошла реализация, вот:
struct User: Identifiable {
// Можно реализовать как stored property
let id: String
// Можно реализовать как computed property
var displayName: String {
get { "User_(id)" }
set { /* логика установки */ }
}
// Статическое свойство
static let typeName: String = "User"
}
Смотри, какой хитрожопый подход. id сделали константой (let) — и норм, потому что протокол просил только get. А displayName — на, получай вычисляемое свойство, и сеттер там есть, пусть даже он нихуя не делает, но формальность соблюдена, ёпта! Главное — тип совпал до запятой. Если в протоколе String, а ты подсунешь String? — всё, пидарас шерстяной, компилятор тебя выебит с предупреждением. Точность, блядь, как в аптеке.
Вот и вся магия. Объявили требования — выполни их как хочешь, лишь бы формально подходило. А то будешь как тот Герасим, только «Муму» говорить и сможешь, когда от тебя get set потребуют.