Id в Objective-C – это любой объект. Для того, чтобы как то отразить id в swift ввели протокол AnyObject. Таким образом все id при портировании в swift заменяют на AnyObject.
Так же можно переназначить переменную объектом другого типа, если ее тип указан как AnyObject
1 2 |
var myObject : AnyObject = UITableViewCell() myObject = NSDate() |
Так же возможно вызывать любой Objective-C метод или свойства на AnyObject (включая Objective-C совместимые методы помеченные атрибутом @objc)
1 2 |
let futureDate = myObject.dateByAddingTimeInterval(10) let timeSinceNow = myObject.timeIntervalSinceNow |
Но если будет вызван не существующий метод или обратимся к не существующему свойству – быдет вызвана ошибка
1 |
myObject.characterAtIndex(5) // error |
Чтобы избежать этого – воспользуемся преимуществами опционалов, вызов метода на AnyObject трактуется как Implicitly Unwrapped Optionals (тот самый который с !), соответственно можно проверять на корректность с помощью Optional Binding.
Вызов же свойств на AnyObject – всегда возвращает опционал
1 2 3 4 5 |
let myCount = myObject.count //nil let myChar = myObject.characterAtIndex?(5) // nil if let fifthCharacter = myObject.characterAtIndex?(5) { print("Found \(fifthCharacter) at index 5") } |
При приведении AnyObject к конкретному типу как всегда вернется опционал
1 2 3 4 5 |
let userDefaults = NSUserDefaults.standardUserDefaults() let lastRefreshDate: AnyObject? = userDefaults.objectForKey("LastRefreshDate") if let date = lastRefreshDate as? NSDate { print("\(date.timeIntervalSinceReferenceDate)") } |
Ну или если уверены в том, какого типа переменная – можно приводить с помощью as! (если предположение ошибочно – вылетит ошибка)
1 2 |
let myDate = lastRefreshDate as NSDate let timeInterval = myDate.timeIntervalSinceReferenceDate |