ios - 合并重叠的 CGRect
问题描述
如果我有一堂课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)
}
}
}
解决方案
Swiftfor
循环是静态的,这意味着在开始时确定索引的范围。虽然buttons.count
当您删除下一个项目时会不断减少,但两者i
都j
在计数直到开始buttons.count
,这就是您崩溃的原因。
swift (c-like) 中没有动态for
,这就是为什么你必须使用 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
}
推荐阅读
- javascript - 我需要在我的数据库函数响应中返回一个唯一的用户 ID,我该怎么做
- javascript - 在 Typescript 接收函数中使用 Array.from 未定义错误
- maven - 任何人都可以找出为什么我仍然收到此错误,“创建名称为 'dataSource' 的 bean 时出错”
- python - 如何让 VS Code 运行“python”而不是“&C:/Users/[username]/AppData/Local/Programs/Python/Python38/python.exe”?
- javascript - 在 history.listen 的 useEffect 中使用 useState 钩子
- jquery - 向左或向右滑动到元素
- shell - 复制许多文件并对内容进行一些修改
- javascript - 循环 Axios 的更好方法
- php - Laravel 6无法显示另一个表中的项目名称
- sparql - 从 SPARQL 中的不同页面检索信息