В беспорядке с Swift сегодня я наткнулся на странную вещь. Ниже приведен пример модульного теста, который показывает некоторые неожиданные действия при использовании AnyObject Swift.Странное поведение AnyObject Swift
class SwiftLanguageTests: XCTestCase {
class TestClass {
var name:String?
var xyz:String?
}
func testAccessingPropertiesOfAnyObjectInstancesReturnsNils() {
let instance = TestClass()
instance.xyz = "xyz"
instance.name = "name"
let typeAnyObject = instance as AnyObject
// Correct: Won't compile because 'xyz' is an unknown property in any class.
XCTAssertEqual("xyz", typeAnyObject.xyz)
// Unexpected: Will compile because 'name' is a property of NSException
// Strange: But returns a nil when accessed.
XCTAssertEqual("name", typeAnyObject.name)
}
}
Этот код является упрощение какой-то другой код, где есть Swift функция, которая может возвращать только AnyObject
.
Как и следовало ожидать, после создания экземпляра TestClass
, отбрасывая его AnyObject
и установив другую переменную, доступ к свойству xyz
не будет компилироваться, так как AnyObject
не обладают таким свойством.
Но удивительно, что свойство, называемое name
, принимается компилятором, потому что есть свойство под этим именем на NSException
. Похоже, что Swift с удовольствием принимает любое имя свойства, если оно существует где-то во время выполнения.
Следующее неожиданное поведение и все, что было начато, это то, что попытка получить доступ к свойству name
возвращает нуль. Наблюдая за различными переменными в отладчике, я вижу, что typeAnyObject
указывает на исходный экземпляр TestClass
, а его свойство name
имеет значение «имя».
Swift не выдает ошибки при доступе к typeAnyObject.name
, поэтому я ожидаю, что он найдет и вернет «имя». Но вместо этого я получаю нуль.
Мне было бы интересно, если кто-нибудь может пролить свет на то, что здесь происходит?
Моя основная забота состоит в том, что я ожидал бы, что Свифт либо выбросит ошибку при доступе к свойству, которого нет на AnyObject
, либо найти и вернуть правильное значение. В настоящее время ничего не происходит.
Спасибо за это подробное объяснение. Это действительно помогло. – drekka