合并重叠的 CGRects
Merge overlapping CGRects
如果我有 class Button
:
class Button: Hashable {
private let id: String
var name: String
var rect: CGRect
}
我还有一个 Button
数组:var buttons: [Button]
,如何合并 buttons
数组中的每个重叠按钮? CGRect
有一个 intersects() -> Bool
和 union() -> CGRect
函数。
我试过了,结果出现索引超出范围错误:
for i in 0..<buttons.count {
for j in (i+1)..<buttons.count {
if buttons[i].rect.intersects(buttons[j].rect) {
let secondRect = buttons[j].rect
let union = buttons[i].rect.union(secondRect)
buttons[i].rect = union
buttons.remove(at: j)
}
}
}
Swift for
循环是静态的,这意味着索引的范围在开始时确定。当您删除下一个项目时 buttons.count
不断减少,i
和 j
都在计数直到开始 buttons.count
,这就是您崩溃的原因。
swift 中没有动态 for
(类似 c),这就是为什么您必须改用 while 的原因:
var i = 0
while i < buttons.count {
var j = i + 1
while j < buttons.count {
if buttons[i].rect.intersects(buttons[j].rect) {
let secondRect = buttons[j].rect
let union = buttons[i].rect.union(secondRect)
buttons[i].rect = union
buttons.remove(at: j)
} else {
j += 1
}
}
i += 1
}
如果我有 class Button
:
class Button: Hashable {
private let id: String
var name: String
var rect: CGRect
}
我还有一个 Button
数组:var buttons: [Button]
,如何合并 buttons
数组中的每个重叠按钮? CGRect
有一个 intersects() -> Bool
和 union() -> CGRect
函数。
我试过了,结果出现索引超出范围错误:
for i in 0..<buttons.count {
for j in (i+1)..<buttons.count {
if buttons[i].rect.intersects(buttons[j].rect) {
let secondRect = buttons[j].rect
let union = buttons[i].rect.union(secondRect)
buttons[i].rect = union
buttons.remove(at: j)
}
}
}
Swift for
循环是静态的,这意味着索引的范围在开始时确定。当您删除下一个项目时 buttons.count
不断减少,i
和 j
都在计数直到开始 buttons.count
,这就是您崩溃的原因。
swift 中没有动态 for
(类似 c),这就是为什么您必须改用 while 的原因:
var i = 0
while i < buttons.count {
var j = i + 1
while j < buttons.count {
if buttons[i].rect.intersects(buttons[j].rect) {
let secondRect = buttons[j].rect
let union = buttons[i].rect.union(secondRect)
buttons[i].rect = union
buttons.remove(at: j)
} else {
j += 1
}
}
i += 1
}