2015-03-05 4 views
2

Я хочу ссылаться на перечисленные объекты с их конкретным типом, а не только на общий AnyObject!, но не могу найти никакой информации об этом в документах.enumerateObjectsUsingBlock - параметры литья в Swift

Подпись enumerateObjectsUsingBlock в Swift является:

func enumerateObjectsUsingBlock(_ block: ((AnyObject!, 
             Int, 
             UnsafePointer<ObjCBool>) -> Void)!) 

и в Objective C:

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, 
            NSUInteger idx, 
            BOOL *stop))block 

Если я хочу, чтобы рассматривать объекты, которые повторяются в течение как определенного типа, в Objective CI просто отрегулируйте подпись на лету, например:

[array enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop){ 
    // ...some function of s as NSString, not just id... 
}]; 

я получаю это поведение в Свифт?

+0

Вы пробовали кастинг? – Abizern

+0

Он работает с кастингом в функциональном теле, но это выглядит не так ... естественным как адаптированная сигнатура в Obj-C. – SaltyNuts

ответ

7

В Swift вы не можете «подстроить» подпись блока/закрытия, как в Objective-C, вам нужно явно указать. Либо с опциональной гипсе:

array.enumerateObjectsUsingBlock({ object, index, stop in 
    if let str = object as? String { 
     println(str) 
    } 
}) 

или с принудительным броском, если вы уверены, что все объекты являются строками:

array.enumerateObjectsUsingBlock({ object, index, stop in 
    let str = object as String // `as!` in Swift 1.2 
    println(str) 
}) 

С NSArray мосты к Array бесшовно, вы можете альтернативно использовать Array перечисление:

for str in array as [String] { 
    println(str) 
} 

или, если вам нужны элементы вместе с их индексом:

for (index, str) in enumerate(array as [String]) { 
    println("\(index): \(str)") 
} 

Обновление для Swift 3,0

С enumerateObjects(using:):

array.enumerateObjects(using: { (object, index, stop) in 
    if let str = object as? String { 
     print("\(index): \(str)") 
    } 
}) 

Перечислите в Swift массив:

if let a = array as? [String] { 
    for str in a { 
     print(str) 
    } 
} 

Перечислить элементы и индексы, Swift массив:

if let a = array as? [String] { 
    for (index, str) in a.enumerated() { 
     print("\(index): \(str)") 
    } 
} 
1

Я рекомендую использовать быстрый для/каждого оператора, который автоматически обеспечивает каждый элемент в качестве переменного типа содержащегося в стремительном массиве:

let array: [String] = ["1", "2", "3"] 

for element in array { 
    println(element) // element is of String type 
} 

с NSArray вы можете использовать тот же оператор, но с явным гипсом:

let nsarray: NSArray = ["1", "2", "3"] 

for element in nsarray { 
    let value = element as String // note: use `as!` in swift 1.2 
    println(value) 
} 

Если вы все еще используете enumerateObjectsUsingBlock:

nsarray.enumerateObjectsUsingBlock { (element, index, stop) in 
    let stringElement = element as String 
    println(stringElement) 
} 
+0

Я надеялся использовать 'enumerateObjectsUsingBlock', чтобы получить объекты вместе со своими индексами за один раз. Я бы определенно использовал более простую конструкцию 'for', если мне не нужны индексы или дополнительные параметры, такие как параллелизм. – SaltyNuts

Смежные вопросы