2016-10-28 17 views
1

Я работаю с чем-то тривиальным к этому:Как правильно проверить успешное нажатие кнопки 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». Что мне здесь не хватает?

+0

Почему вы вообще кастинг? – Alexander

+0

P.s., не записывайте '-> Void' в подписи функций. – Alexander

+0

К сожалению. Тем не менее, я не знаю, полностью ли я понимаю цель приведения, но для своих собственных намерений я просто вижу, что потребуется для передачи объекта структуры, и чтобы он попал в блок «else». – Steals

ответ

0

На самом деле я не могу воссоздать ошибки, которые вы показываете. Однако компилятор жалуется на очевидные ошибки в параметре функции.

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. 

You can try it online, here.

+0

ах извинения. В попытке trivialize мой фрагмент кода, я представил много опечаток. Хотя я не получал никаких предупреждений через песочницу, подключение этого же кода к игровой площадке или XCode по-прежнему дает мне те же два предупреждения, которые я перечислял выше. – Steals

+0

Интересно, я получаю предупреждения в Xcode. Такое поведение, вероятно, является побочным эффектом для автоматического бокса Swift для типов struct. – Alexander

0

Вы можете проверить, если тип переменной 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())) 
+0

Спасибо. Это то, что меня бросало в петлю. У меня создалось впечатление, что Struct нельзя передать в AnyObject, но когда я создал структуру и попробовал это: 'SomeStruct() - AnyObject', он возвращался true. Любая идея, почему это так? – Steals

+0

Вы можете просто написать 'someObject is AnyObject', без' type (of:) ' – Alexander

+0

Кроме того, мне интересно, есть ли проблема, которую я написал с помощью этой строки' if let object = someObject as? AnyObject', потому что даже при тестировании моего isAnyObject с UIView я все еще попадаю в оператор «if» – Steals