Можно ли получить что-то вроде ниже, используя дженерики в 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
@Sh_Khan: Ответ, которого я ожидал, не был в примерах, которые вы пометили как дубликаты. Фактически, приведенный ниже ответ - это то, что мне нужно. Не могли бы вы удалить повторяющийся тег?
Вот как вы можете использовать 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
и XYZ
protocol PPP
и реализуйте его свойство title
как в ABC
, так и в XYZ
.
print(option1.data?.title)
print(option2.data?.title)
Спасибо за ответ. Но мне нужно определить тип данных для данных в последней строке. Как мне это сделать без приведения типов?
Это правильно, о чем я уже знаю. Я ищу что-то вроде: option1.data.title Могу ли я получить прямой доступ к переменной, не проверяя ее тип? Я предполагаю, что это можно сделать с помощью протоколов?
Обновил и это. Попробуйте.
Спасибо. Это чудесная помощь. Значит ли это, что мне придется объявлять все переменные классов ABC() и XYZ() в протоколе PPP?
Нет. А вот наоборот true
. Вам необходимо реализовать обязательные variables
и methods
из PPP
в ABC
и XYZ
.
Давайте продолжить обсуждение в чате.
Еще немного путаницы: теперь он просит добавить суффикс «Любой» ?
Добавьте в угловые скобки тот же тип, который вы передаете в качестве данных let option1 = Option<ABC>(name: "Test1", data: object1)
Один вопрос - Вам действительно нужно class Option
сейчас? Я думаю, что ваше требование теперь удовлетворено с помощью protocol
. Проверьте идентифицируйте вариант использования.
Да, класс Option требуется, так как он содержит другие свойства, связанные с tableView.
Ваш ответ великолепен!! Это сработало. Но у меня возникла другая проблема. Я не хочу добавлять все свойства XYZ() в ABC(). Однако протокол PPP вынуждает добавлять все свойства. Можно ли как-то этого избежать?
Я смог сделать это необязательным. Спасибо чувак!!
Привет @PGDev Можете ли вы попытаться ответить на этот вопрос: stackoverflow.com/questions/56382822/…
class Option: <T>
должно бытьclass Option<T>