let f:() -> Void = { }
let array = ["a", 1, false, f] as [Any]
if array[3] is AnyObject {
print(array[3])
}
Почему элемент, оценивающий значение true для AnyObject, даже если массив настроен на сохранение Any?Сохранение массива Любые объекты также имеют тип AnyObject
Почему функция оценивает значение true как объект AnyObject, хотя AnyObject по определению может быть только классами?
В качестве другого примера:
let f:() -> Bool = { return true }
let ff = f as AnyObject
(ff as() -> Bool)()
Это противоречит определению AnyObject в API doc, в котором говорится, что:
AnyObject может быть использован в качестве конкретного типа для экземпляра любого класс, класс или протокол только для классов.
или официальный Swift Programming Language Guide:
• Любой может представлять собой экземпляр любого типа на всех, в том числе функции типов.
• AnyObject может представлять экземпляр любого типа класса.
В приведенном выше примере это выглядит как функция может быть представлена как AnyObject.
В другом месте SO (как указано @hamish) есть объяснение, что внутренне, поскольку используется класс SwiftValue, все можно подключить к AnyObject. Логика объяснения кажется ошибочной/обратной, так как мы должны сделать реализацию соответствующей определению языка, а не наоборот, так что реализация неверна или определение оператора AnyObject и typecheck неверно?
Потому что * все * является мостом в 'AnyObject' в Swift 3. См. [AnyObject не работает в Xcode8 beta6?] (http://stackoverflow.com/q/39033194/2976878) – Hamish
Почему и как функция может быть сменена для AnyObject? Разве это не нарушает определение AnyObject? Такое поведение кажется неправильным, даже если это возможно. – Boon
Прочтите связанные вопросы и ответы - вещи, которые несовместимы с Obj-C, помещаются в поле совместимого с Objc-C '_SwiftValue'. Причиной этого является тот факт, что 'id' теперь подключен к Swift как' Any', поэтому 'Any' нужно снова подключить к' id'. – Hamish