enumerateObjectsUsingBlock - 在 Swift 中转换参数
enumerateObjectsUsingBlock - casting parameters in Swift
我想引用具有特定类型的枚举对象,而不仅仅是泛型 AnyObject!
,但在文档中找不到任何相关信息。
Swift中enumerateObjectsUsingBlock
的签名是:
func enumerateObjectsUsingBlock(_ block: ((AnyObject!,
Int,
UnsafePointer<ObjCBool>) -> Void)!)
并在 Objective C 中:
- (void)enumerateObjectsUsingBlock:(void (^)(id obj,
NSUInteger idx,
BOOL *stop))block
如果我想将迭代的对象视为特定类型,在 Objective C 中我只需即时调整签名,例如:
[array enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop){
// ...some function of s as NSString, not just id...
}];
如何在 Swift 中获得此行为?
在 Swift 中你不能 "tweak" block/closure 签名
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)
}
我想引用具有特定类型的枚举对象,而不仅仅是泛型 AnyObject!
,但在文档中找不到任何相关信息。
Swift中enumerateObjectsUsingBlock
的签名是:
func enumerateObjectsUsingBlock(_ block: ((AnyObject!,
Int,
UnsafePointer<ObjCBool>) -> Void)!)
并在 Objective C 中:
- (void)enumerateObjectsUsingBlock:(void (^)(id obj,
NSUInteger idx,
BOOL *stop))block
如果我想将迭代的对象视为特定类型,在 Objective C 中我只需即时调整签名,例如:
[array enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop){
// ...some function of s as NSString, not just id...
}];
如何在 Swift 中获得此行为?
在 Swift 中你不能 "tweak" block/closure 签名 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)
}