Скажем, у меня есть массив AnyObject
.Фильтрация массива Swift [AnyObject] по типу
let grabBag: [AnyObject] = [ "Tom", 4, "Dick", NSObject(), "Harry" ]
, и я хочу, чтобы бросить его в массив Strings
, извлекая только те элементы, которые на самом деле Strings
. Я бы ожидать, что это работает:
let strings = grabBag.filter{ $0 is String } as! [String] // 1
но дает ошибку 'Bool' is not convertible to 'String'
. Тем не менее, это работает:
let definitelyStrings = grabBag.filter{ $0 is String } // 2
let strings = definitelyStrings as! [String] //
Почему 2
работу, когда 1
не делает? И есть ли более простой способ (2
) извлечения и отливки элементов [AnyObject]
на все, что [T]
?
В примере 2 вам не нужна вторая строка: 'let strings = grabBag.filter {$ 0 is String}' достаточно. Нет принудительного литья. Докажите это с помощью 'stringings is [String]', который возвращает true – vadian
@vadian 'let strings = grabBag.filter {$ 0 is String}' возвращает '[AnyObject]' с массивом 'grabBag' OP, а не' [String] '. – Moritz
@EricD: Но вы можете сделать 'grabBag.filter {$ 0 is String} .map {$ 0.lowercaseString}', который обычно невозможен с '[AnyObject]' – vadian