通过动态类快速映射/过滤?

标签 swift

我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码:

class Joint {
    var position:Position
    init(_ position:Position) {
        self.position = position
    }
}

class Position {
    var point:Point {
        return Point (0,0)
    }
}

class Point: Position {
   //Something different 
}

class Vector:Position {
   //Something different 
}

class Attachment : Position {
   //Something different 
}

let content : [Joint] = [Joint(Vector()), Joint(Vector()), Joint(Attachment()), Joint(Point()), Joint(Point()) ]
let positionTypes:[Position.Type] = [Point.self, Attachment.self, Vector.self]


let points :[Position] = content.filter{$0.position is Point}.map{$0.position as! Point}
Swift.print(points)
    // OK, prints: [__lldb_expr_148.Point, __lldb_expr_148.Point]
let attachments :[Position] = content.filter{$0.position is Attachment}.map{$0.position as! Attachment}
Swift.print(attachments)
    // OK, prints: [__lldb_expr_148.Attachment]
let vectors :[Position] = content.filter{$0.position is Vector}.map{$0.position as! Vector}
Swift.print(vectors)
    // OK, prints: [__lldb_expr_148.Vector, __lldb_expr_148.Vector]

for positionType in positionTypes {
    Swift.print (positionType, type(of:positionType))

    //  if the next line does not exist loop returns:
    //        Point Position.Type
    //        Attachment Position.Type
    //        Vector Position.Type

    //  This line doesn't work:
    let positions:[Position] = content.filter{$0.position is positionType}.map{$0.position as! positionType}
}

在最后一行我有一条消息Use of undeclared type positionType

如何让最后一行工作?

最佳答案

这不是正确的做法:

let points :[Position] = content.filter{$0.position is Point}.map{$0.position as! Point}

这里正确的工具是flatMap:

let points: [Position] = content.flatMap { $0.position as? Point }

但是 as? 转换并不是真正必要的。 .position 始终是一个 Position;没有必要将它转换到任何东西上。所以你也可以这样做:

let points: [Position] = content.map { $0.position }.filter { $0 is Point }

该模式允许您执行您在最后一步中尝试执行的操作。映射到 .position,然后根据类型进行过滤。

let positions:[Position] = content
    .map { $0.position }
    .filter { type(of: $0) == positionType }
}

关于通过动态类快速映射/过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502295/

相关文章:

ios - ViewController 中的内存泄漏

ios - 如何在我的iOS Xing App中深度链接到个人资料?

ios - UIScrollViewDelegate - scrollViewDidEndDragging 中的 animateWithDuration 未按预期工作

ios - swift 每种屏幕尺寸的不同 StoryBoard

ios - CoreLocation 不适用于 iOS 8 上的 Adhoc Distribution

ios - 具有从右到左文本和自动调整字体大小的多行 UILabel

swift - 获取协议(protocol)的真实类型以与存储在变量中的类型进行比较

swift - 注册 AWSS3 配置造成 5000 多次内存泄漏

ios - 如何将字典/数组映射到 RealmSwift 对象

ios - 在闭包内部调用 Swift 闭包