Передача общих параметров в универсальном классе

Можно ли получить что-то вроде ниже, используя дженерики в Swift? Любая помощь будет оценена больше, чем что-либо еще.

class ABC {
   var title: String?
}

class Option: <T> {
   var name: String?
   var data: T?
}

let object1 = ABC()

let option = Option(name: "Test", data: object1)

// Getting data again
let data = option.data
class Option: <T> должно быть class Option<T>
Sh_Khan 21.05.2019 19:05

@Sh_Khan: Ответ, которого я ожидал, не был в примерах, которые вы пометили как дубликаты. Фактически, приведенный ниже ответ - это то, что мне нужно. Не могли бы вы удалить повторяющийся тег?

Amrit Sidhu 21.05.2019 19:36
Стоит ли изучать 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
2
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот как вы можете использовать Generics в Swift.

protocol PPP {
    var title: String? {get set}
}

class ABC: PPP {
    var title: String?
}

class XYZ: PPP {
    var title: String?
}

class Option<T> {
    var name: String?
    var data: T?

    init(name: String?, data: T?) {
        self.name = name
        self.data = data
    }
}

let object1 = ABC()
let option1 = Option(name: "Test1", data: object1)

let object2 = XYZ()
let option2 = Option(name: "Test2", data: object2)

Так как classes в Swift не имеет default initializer, поэтому создайте такой, который принимает 2 параметра — String? и T?.

Вы можете использовать метод type(of:), чтобы идентифицировать type из object.

print(type(of: option1.data)) //ABC
print(type(of: option2.data)) //XYZ

Вы можете использовать protocol для доступа к title как в ABC, так и в XYZ.

Соответствуйте ABC и XYZprotocol PPP и реализуйте его свойство title как в ABC, так и в XYZ.

print(option1.data?.title)
print(option2.data?.title)

Спасибо за ответ. Но мне нужно определить тип данных для данных в последней строке. Как мне это сделать без приведения типов?

Amrit Sidhu 21.05.2019 19:06

Это правильно, о чем я уже знаю. Я ищу что-то вроде: option1.data.title Могу ли я получить прямой доступ к переменной, не проверяя ее тип? Я предполагаю, что это можно сделать с помощью протоколов?

Amrit Sidhu 21.05.2019 19:12

Обновил и это. Попробуйте.

PGDev 21.05.2019 19:15

Спасибо. Это чудесная помощь. Значит ли это, что мне придется объявлять все переменные классов ABC() и XYZ() в протоколе PPP?

Amrit Sidhu 21.05.2019 19:17

Нет. А вот наоборот true. Вам необходимо реализовать обязательные variables и methods из PPP в ABC и XYZ.

PGDev 21.05.2019 19:18

Давайте продолжить обсуждение в чате.

Amrit Sidhu 21.05.2019 19:19

Еще немного путаницы: теперь он просит добавить суффикс «Любой» ?

Amrit Sidhu 21.05.2019 19:39

Добавьте в угловые скобки тот же тип, который вы передаете в качестве данных let option1 = Option<ABC>(name: "Test1", data: object1)

PGDev 21.05.2019 19:41

Один вопрос - Вам действительно нужно class Option сейчас? Я думаю, что ваше требование теперь удовлетворено с помощью protocol. Проверьте идентифицируйте вариант использования.

PGDev 21.05.2019 19:43

Да, класс Option требуется, так как он содержит другие свойства, связанные с tableView.

Amrit Sidhu 21.05.2019 19:44

Ваш ответ великолепен!! Это сработало. Но у меня возникла другая проблема. Я не хочу добавлять все свойства XYZ() в ABC(). Однако протокол PPP вынуждает добавлять все свойства. Можно ли как-то этого избежать?

Amrit Sidhu 21.05.2019 20:00

Я смог сделать это необязательным. Спасибо чувак!!

Amrit Sidhu 21.05.2019 20:15

Привет @PGDev Можете ли вы попытаться ответить на этот вопрос: stackoverflow.com/questions/56382822/…

Amrit Sidhu 30.05.2019 19:45

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