Тип быстрой сборки c во время выполнения - PullRequest
0 голосов
/ 04 мая 2020

Swift 5.1 Предположим, я десериализирую некоторые данные. Я заинтересован в воссоздании тех же типов, которые были сериализованы, но некоторые могут включать дженерики. Рассмотрим следующий пример:

let layers = 4
let value: Int64 = 17

var output: Any

???SOMETHING???

print("\(type(of: output))") // "Optional<Optional<Optional<Optional<Int64>>>>"

Есть ли способ получить output с типом времени выполнения Optional<...Optional<Int64>...>, где число вложенных слоев Optional равно layers ? (И не опирается, например, на жестко запрограммированные операторы case, полные классов.) Возможно, размышления, некоторые инициализаторы типов, о которых я не знаю, возможно, некоторые черные маги c используют указатели или object_setClass или что-то еще?

Я бы также принял убедительные доказательства того, что это принципиально невозможно в Swift, например, документация, в которой говорится, что каждая спецификация класса c, используемого в программе, генерируется индивидуально во время компиляции, и, следовательно, вы не можете заново указать шаблон c класс во время выполнения. ... Хотя даже в этом случае это все еще возможно, учитывая такие вещи, как Java s ClassLoader s.

1 Ответ

0 голосов
/ 04 мая 2020

Это сработало для меня:

let layers = 100
let value: Int64 = 17
var output: Any = value

for _ in 1...layers {
    output = Optional(output)
}

print(output)

Однако тип печати output равен Optional<Any>
Что печально.


Я тоже столкнулся с большим количеством ошибок

// Could not cast value of type 'Swift.Optional<Any>' (0x7fff91c591e8) to 'Any.Type' (0x7fff91c59288).
// Cannot downcast from 'Any' to a more optional type 'Optional<_>'

Я нашел этот ответ довольно неплохим.
Но он на самом деле не возвращает упакованный тип, он просто проверяет, необязательно.
Некоторые ответы действительно хороши
Как проверить, является ли тип необязательным в Swift?


Вот несколько попыток, которые я предпринял пытаясь подсчитать, сколько вложенных опциональных файлов что-то имеет (это не сработало)

protocol OptionalProtocol { static var wrappedType: Any.Type { get } }
extension Optional : OptionalProtocol {
    static var wrappedType: Any.Type { return Wrapped.self }
    // static var wrapped: Any { return  }
}
func wrappedTypeFromOptionalType(_ type: Any.Type) -> Any.Type? {
  return (type as? OptionalProtocol.Type)?.wrappedType
}
var aaa: Any.Type? = wrappedTypeFromOptionalType(type(of: output))

while let aa = wrappedTypeFromOptionalType(type(of: aaa!)) {
    nested += 1
    aaa = aa
}

и этого не сделали

while let aa = wrappedTypeFromOptionalType(type(of: aaa!)) {
    nested += 1
    aaa = aa
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...