Я дам более конкретное предложение, основанное на приведенных выше комментариях ... Я не верю, что существует точная параллель с концепцией деконструкции, но есть несколько способов, чтобы различные объекты представляли себя подобным образом, например, через кортеж строк.
Я полагаю, что часть цели здесь состоит в том, чтобы иметь возможность передавать различные типы объектов некоторым методам, которым требуется более общий c кортеж в качестве входных данных.
One Swift -подобный способ сделать это - использовать протокол, который объявляет представление кортежа, и иметь любой объект, с которым вы хотите работать, в соответствии с протоколом. Вероятно, для описания требуется почти столько же слов, сколько для простого кодирования. :)
Вот пример протокола:
protocol TwoString {
var tupl: (String, String) { get }
}
Вот простой класс, который принял протокол для возврата имени и фамилии:
class Name: TwoString {
var first: String = ""
var last: String = ""
init(first: String, last: String) { self.first = first; self.last = last }
var tupl: (String, String) {
get {
return (self.first, self.last)
}
}
}
Другой класс может принять протокол и использовать другую пару полей для кортежа, например
class Taxonomy: TwoString {
var genus: String = ""
var species: String = ""
init(genus: String, species: String) { self.genus = genus; self.species = species }
var tupl: (String, String) {
get {
return (self.genus, self.species)
}
}
}
Теперь у вас могут быть методы, которые принимают тип протокола TwoString , ничего не зная о базовом классе, за исключением того, что он может предоставлять двухстрочное представление самого себя.
Если вы хотите преобразовать объекты, которые вы изначально не определяли, для поддержки протокола, вы можете использовать расширение Swift, которое объявляет и реализует протокол на существующий класс:
extension Data: TwoString {
var tupl: (String, String) {
get {
return (String(describing:self.count), self.base64EncodedString())
}
}
}
Теперь такой метод, как fun c handleTwoString (_ item: TwoString ), может принимать объект Name, Taxonomy или Data и получать двухстрочный кортеж, ничего не зная о базовом объекте.
Или, если вы хотите работать с API, которые принимают кортеж с двумя элементами, вы всегда можете просто явно передать член tupl:
SomeAPI.handleStringTuple(myName.tupl)
SomeAPI.handleStringTuple(taxonomy.tupl)
SomeAPI.handleStringTuple(someData.tupl)