Как я правильно проверяю на успешную загрузку в AnyObject?
Я работаю с чем-то упрощенным для этого:
func isAnyObject<T>(someObject: T) {
if let object = someObject as? AnyObject {
// do something
} else {
// do something else
}
}
Что дает мне предупреждения компилятора:
- Условное приведение от 'T' к 'AnyObject' всегда завершается успешно
- Необязательное выражение типа 'AnyObject', используемое при проверке опциональности
Я понимаю, почему актеры всегда преуспевают, но я не знаю, что делать, чтобы это исправить. Я попытался изменить строку 2 на if let object = foo as AnyObject?
но когда я передаю структуру через функцию, она все равно попадает в блок if. Что мне здесь не хватает?
2 ответа
Вы можете проверить, является ли тип переменной AnyObject. Если так, то это ссылочный тип. Если не его тип значения. Я также получаю предупреждение на детской площадке, но предупреждение неверно. Приведенный ниже код выдает "ложь", "ложь", "ложь", "ложь", "истина", поэтому функция четко работает, а тест не всегда соответствует действительности, как говорится в предупреждении. Это ошибка.
func isReferenceType<T>(someObject: T) -> Bool {
return type(of: someObject) is AnyObject
}
//Values
print(isReferenceType(someObject: "a"))
print(isReferenceType(someObject: 1))
print(isReferenceType(someObject: Int?(0)))
print(isReferenceType(someObject: {print("1")}))
//Reference
print(isReferenceType(someObject: UIView()))
На самом деле я не могу воссоздать ошибки, которые вы выставляете. Однако компилятор действительно жалуется на очевидные ошибки в параметре функции.
import Foundation
func isAnyObject<T>( _ someObject: T) {
if let object = someObject as? AnyObject {
print("It's an AnyObject: \(object)")
} else {
print("It's not an AnyObject.")
}
}
let classObject: NSString = "This is an NSString Object"
let structInstance: String = "This is a Swift String Instance"
isAnyObject(classObject) // It's an AnyObject: This is an NSString Object
isAnyObject(structInstance) // It's not an AnyObject.