繁体   English   中英

enumerateObjectsUsingBlock - 在Swift中转换参数

[英]enumerateObjectsUsingBlock - casting parameters in Swift

我想引用具有特定类型的枚举对象,而不仅仅是一个通用的AnyObject! ,但在文档中找不到任何有关它的信息。

Swift中enumerateObjectsUsingBlock的签名是:

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

在目标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... 
}];

如何在Swift中获得此行为?

在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)")
    }
}

我建议使用swift for / each语句,它自动将每个元素作为swift数组中包含的类型的变量提供:

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM