2016-03-31 6 views
2

Есть ли «безопасный» способ написать это, что защищает от ошибок во время выполнения?Безопасный способ силового понижения

for posts in resultsArray as! [AnyObject] { 
    //do stuff 
} 

Я чувствую себя, если пусть и охранник оператор будет работать здесь, я не знаю, как сделать эту работу с для в цикле.

+4

У какого типа 'resultsArray'? Что именно вы пытаетесь достичь? –

ответ

2
  • as используется для приведения к базовому типу и тип литья в мостовом типа
  • as? используется для безопасного литья, возвращать ноль, если не удалось
  • as! б/у t о силе литья, аварии, если не удалось

Safe понижающего приведения

for posts in resultsArray as? [AnyObject] { 
    //do stuff 
} 

posts будет переменным типа AnyObject ?. Если базовый тип - это нечто иное, чем безвредно, просто назначьте nil.


небезопасный понижающее приведение

for posts in resultsArray as! [AnyObject] { 
    //do stuff 
} 

Это тоже приведет сообщений, находящихся типа AnyObject ?, но это будет crash, если базовый тип что-то еще.

Reference

+1

В примере «Unsafe Downcasting» 'posts' имеет тип' AnyObject', а не 'AnyObject?'. - Пример «Safe Downcasting» как-то не компилируется для меня: * «значение необязательного типа» [AnyObject]? не разворачивается, вы хотели использовать '!' или '?'?"* –

1

Вы можете выполнить литье внутри встроенного контура с помощью as?.

for result in resultsArray { 
    if let post = result as? AnyObject { 
     //do stuff 
    } else { 
     //do other stuff 
    } 
} 

Таким образом, вы можете выбрать, что произойдет, если бросок не сработает.

0

Почему вы отливаете resultsArray в [AnyObject]? Разве не лучше ли применить его к правильному типу?

Так дали

class Post { } 
let resultsArray: Any = [Post(), Post()] 

Вы можете написать эту

func doSomething(resultsArray: Any) { 
    guard let posts = resultsArray as? [Post] else { return } 
    for post in posts { 
     print(post) 
    } 
} 
Смежные вопросы