什么是makeObjectsPerformSelector的Swift等效方法?

37

在 Objective-C 中,我使用以下代码来删除任何子视图:

[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

但是如何在Swift中使用它?我看到苹果文档中使用这个方法的示例。

func makeObjectsPerformSelector(_ aSelector: Selector)

但是当我尝试时,出现错误:'AnyObject[]'没有名为'makeObjectsPerformSelector'的成员

有没有办法在Swift中删除子视图?


(view.subviews as NSArray).enumerateObjectsUsingBlock({ (view, index, stop) in view.removeFromSuperview() }) - HamzaGhazouani
3个回答

100

使用forEach

self.view.subviews.forEach { subview in
    subview.removeFromSuperview()
}

或者像这样:

view.subviews.forEach { $0.removeFromSuperview() }

啊,我没意识到我读的是关于NSArray而不是Swift中的Array的文档。非常感谢。 - yumugee
映射很简单! - Rubycon
我认为map()变体是一个不错的想法,但至少对于NSArray来说不会起作用。Map必须返回一个值(它将集合的值映射到另一个值)。如果你调用的函数是void类型(比如removeFromSuperview()),那么结果数组应该包含什么?(空元组'object'?)这可能有效,但很丑陋:.map { e -> String in e.removeFromSuperview(); return "" } - hnh
2
map 用于从旧数组构建新数组,因此块应该返回一个值用于新数组。似乎没有 make objects perform 的等效方法,你可以使用 'for obj in array {...}',同时在枚举数组时修改它可能不安全。 - Nathan Day
1
从Swift 2.0开始,forEach已经被提供为本地支持。例如:view.subviews.forEach {$0.removeFromSuperview()} - Tommy
显示剩余3条评论

1

它只适用于NSArray和NSMutableArray对象。

这将起作用:

let ar: NSArray = [obj1, obj2, obj3]
ar.makeObjectsPerformSelector("someSelector")

请注意,如果您有一个Array<AnyObject>,您可以自由地转换为NSArray,反之亦然。
let anNSArray: NSArray = anArrayOfAnyObject
anNSArray.makeObjectsPerformSelector( "someSelector")

问题并不是在问如何使用NSArray来实现,而是在问Swift中的等效方法是什么? - Max MacLeod

1
自 Xcode 7 开始,完整的 performSelector 方法家族都可在 Swift 中使用,包括针对 NSArray 的 makeObjectsPerformSelector()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接