Как я правильно проверяю на успешную загрузку в AnyObject?

Я работаю с чем-то упрощенным для этого:

func isAnyObject<T>(someObject: T) {
    if let object = someObject as? AnyObject {
        // do something
    } else {
        // do something else
    }
}

Что дает мне предупреждения компилятора:

  1. Условное приведение от 'T' к 'AnyObject' всегда завершается успешно
  2. Необязательное выражение типа '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.

Вы можете попробовать это онлайн, здесь.

Другие вопросы по тегам