- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Swift playground 文件,其中有一个工厂列表,其中包含称为引擎的子实体;一个玩家可以容纳许多引擎的地方
关系是这样的;
Factory -> Engine <- Player
我正在尝试构建一个 Swift 映射和过滤器,它会生成一个列表,其中列出所有不由给定玩家对象拥有的工厂。
我的代码如下;
//: Swift Playground code
import Foundation
class Factory : CustomStringConvertible {
var name: String = ""
var engines: [Engine] = [Engine]()
var description: String {
return self.name
}
var owners: [Player]? {
let filtered = self.engines.filter { (eng:Engine) -> Bool in
return (eng.owner != nil)
}
.sorted { (engA:Engine, engB:Engine) -> Bool in
return ((engA.owner?.turnOrder)! < (engB.owner?.turnOrder)!)
}.flatMap { (eng:Engine) -> Player? in
return (eng.owner)
}
return filtered
}
init(name: String) {
self.name = name
// create 3 children (engines)
for _ in 1...3 {
let engine = Engine.init(parent: self)
self.engines.append(engine)
}
}
}
class Engine : CustomStringConvertible {
weak var parent: Factory?
weak var owner: Player?
var description: String {
guard let hasParent = self.parent else {
return "N/A"
}
return ("\(hasParent.name) - engine")
}
init(parent: Factory) {
self.parent = parent
}
func setOwner(owner: Player) {
self.owner = owner
self.owner?.addEngine(engine: self)
}
}
class Player : CustomStringConvertible {
var name: String = ""
var engines: [Engine] = [Engine]()
var turnOrder: Int = 0
var description: String {
return self.name
}
init(name: String) {
self.name = name
}
func addEngine(engine: Engine) {
self.engines.append(engine)
}
}
// create 3 factories
let f1 = Factory.init(name: "f1")
let f2 = Factory.init(name: "f2")
let f3 = Factory.init(name: "f3")
let factories = [f1,f2,f3]
let p1 = Player.init(name: "Bob")
if let firstEngine = f1.engines.first {
firstEngine.setOwner(owner: p1)
}
print ("All factories: \(factories)")
print ("p1 = \(p1.name), engines: \(p1.engines)")
for (index, f) in factories.enumerated() {
print ("#\(index), Owners: \(f.owners)")
}
// filter all factories NOT owned by player
let filtered = factories.map({ $0.engines.filter({ (eng: Engine) -> Bool in
return (eng.owner != nil)
})})
print ("factories not owned by player")
print (filtered)
输出如下:
All factories: [f1, f2, f3]
p1 = Bob, engines: [f1 - engine]
#0, Owners: Optional([Bob])
#1, Owners: Optional([])
#2, Owners: Optional([])
factories not owned by player
[[f1 - engine], [], []]
我遇到的问题是最后一个过滤器代码;
// filter all factories NOT owned by player
let filtered = factories.map({ $0.engines.filter({ (eng: Engine) -> Bool in
return (eng.owner != nil)
})})
这只会返回引擎不为零的工厂,
我想使用:
return (eng.owner != p1)
但是返回错误;
error: cannot convert value of type 'Player' to expected argument type '_OptionalNilComparisonType'
return (eng.owner != p1)
因此我想知道,如何过滤工厂 map 并只返回给定玩家不拥有的所有工厂的列表?
非常感谢
最佳答案
我想这就是您要找的:
extension Factory {
func isOwned(by player: Player?) -> Bool {
return self.engines.contains(where: { $0.isOwned(by: player)} )
}
}
extension Engine {
func isOwned(by player: Player?) -> Bool {
return self.owner === player
}
}
let factoriesNotOwnedByP1 = factories.filter { !$0.isOwned(by: p1) }
下面是我对您现有代码所做的一些其他更改:
import Foundation
class Factory {
let name: String
var engines = [Engine]()
init(name: String) {
self.name = name
self.engines += (1...3).map{ _ in Engine(parent: self) }
}
var owners: [Player]? {
return self.engines
.lazy
.flatMap { engine in engine.owner.map{ (engine: engine, owner: $0) } }
.sorted { $0.owner.turnOrder < $1.owner.turnOrder }
.map { $0.owner }
}
func isOwned(by player: Player?) -> Bool {
return self.engines.contains(where: { $0.isOwned(by: player)} )
}
}
extension Factory: CustomStringConvertible {
var description: String { return self.name }
}
class Engine {
weak var parent: Factory?
weak var owner: Player?
init(parent: Factory) {
self.parent = parent
}
func setOwner(owner: Player) {
self.owner = owner
self.owner?.addEngine(engine: self)
}
}
extension Engine: CustomStringConvertible {
var description: String {
guard let parent = self.parent else { return "N/A" }
return ("\(parent.name) - engine")
}
}
class Player {
let name: String
var engines = [Engine]()
var turnOrder = 0
init(name: String) {
self.name = name
}
func addEngine(engine: Engine) {
self.engines.append(engine)
}
}
extension Player: CustomStringConvertible {
var description: String { return self.name }
}
let factories = [
Factory(name: "f1"),
Factory(name: "f2"),
Factory(name: "f3"),
]
let p1 = Player(name: "Bob")
factories.first?.engines.first?.setOwner(owner: p1)
print ("All factories: \(factories)")
print ("p1 = \(p1.name), engines: \(p1.engines)")
for (index, f) in factories.enumerated() {
print("#\(index), Owners: \(String(describing: f.owners))")
}
let factoriesNotOwnedByP1 = factories.filter { !$0.isOwned(by: p1) }
print("factories not owned by player: ")
print(factoriesNotOwnedByP1)
关于arrays - Swift 映射和过滤器 : Find all factories that are not owned by a given player,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45375599/
请看一下我的代码。 int main () { Program* allcommand = new Program; allcommand->addCommand("add", new
因此,当我遇到调试断言时,我正在编写代码。现在我很想知道为什么这段代码不起作用: for(Model::MeshMap::iterator it = obj1->GetMeshes().begin()
这是我上一个问题的延续 Group, Sum byType then get diff using Java streams . 按照建议,我应该作为单独的线程发布,而不是更新原始线程。 因此,通过我
我正在实现一些非常适合 map 的代码。但是,我要迭代的列表中有大量对象,所以我的问题是哪种方法是解决此问题的最佳方法: var stuff = $.map(listOfMyObjects, some
我正在尝试创建一个包含不同类的成员函数指针的映射。成员函数都具有相同的签名。为了做到这一点,我所有的类都继承了一个 Object 类,它只有默认构造函数、虚拟析构函数和一个虚拟 ToString()
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: how do you make a heterogeneous boost::map? 有可能在 C++ 中
我有一个 Mysql 查询,请检查以下内容: SELECT `tbl_classSubjects`.`classID` , `tbl_classSubjects`.`sectionID` , `tbl
抱歉,这可能是一个基本问题。 JNA直接映射和接口(interface)映射有什么区别? 我的解释是否正确: 直接映射 : 直接使用库对象(如 Java 中的静态 main) 接口(interface
在 Twitter's Scala school collections section ,它们显示了一个带有偏函数作为值的 Map: // timesTwo() was defined earlie
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
据我了解,从 scala stdlib 声明一个映射并没有将其专门用于原始类型。我要的不是付出装箱/拆箱的代价,而是同时拥有scala map 的接口(interface)。一个明显的选择是使用 tr
如何为这样的 JSON 响应创建对象映射,它只是一个整数数组: [ 565195, 565309, 565261, 565515, 565292, 565281, 566346, 5
是否可以为 DTO 对象创建映射然后查询它们 而不是域?如果不解释为什么? 如果我需要几个 dtos 怎么办? DTos 是只读的 ID 由 NH 自动生成 将来这些 dtos 将设置映射到链接的 d
我有一个返回的函数(常规代码) [words: "one two", row: 23, col: 45] 在 Scala 中,我将上面更改为 Scala Map,但随后我被迫将其声明为 Map[Str
我有一组与 Vanilla 磅蛋糕烘焙相关的数据(200 行),具有 27 个特征,如下所示。标签caketaste是衡量烤蛋糕的好坏程度,由 bad(0) 定义, neutral(1) , good
我有试图映射到新代码的遗留代码。 OLD_PERSON pid sid name age NEW_PERSON pid sid fid age RESOLVE_PERSON pid fid statu
我有一个表,其中一个字段可以指向其他 3 个表之一中的外键,具体取决于鉴别器值是什么(Project、TimeKeep 或 CostCenter。通常这是用子类实现的,我想知道我有什么 注意子类名称与
我有一个类型 [ST s (Int, [Int])] 的绑定(bind)我正在尝试申请runST使用映射到每个元素,如下所示: name :: [ST s (Int, [Int])] --Of Cou
在我正在进行的项目中,我有以下实体:分析师、客户 和承包商。每个都继承自基类 User。 public abstract class User { public virtual int Id
我想知道是否可以在 Vim 中创建一个映射(对于普通模式),允许用户在映射执行之前输入。 我想为我最常用的 grep 命令创建一个快捷方式的映射。我希望命令允许输入我正在搜索的内容,然后在输入时执行。
我是一名优秀的程序员,十分优秀!