gpt4 book ai didi

ios - enumerateObjectsUsingBlock - 在 Swift 中转换参数

转载 作者:可可西里 更新时间:2023-10-31 23:58:09 25 4
gpt4 key购买 nike

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

enumerateObjectsUsingBlock 在 Swift 中的签名是:

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 中你不能“调整” block /闭包签名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)")
}
}

关于ios - enumerateObjectsUsingBlock - 在 Swift 中转换参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com