Swift:字典键为 CGRect
Posted
技术标签:
【中文标题】Swift:字典键为 CGRect【英文标题】:Swift: Dictionary Key as CGRect 【发布时间】:2015-07-10 23:31:50 【问题描述】:我需要将button
的frame
保存为键,并将数组中的index
保存为其value
。下面是代码:
var buttonLocationWithIndex = Dictionary<CGRect, Int>()
override func viewDidAppear(animated: Bool)
super.viewDidAppear(animated)
for (index, point) in enumerate(self.points)
let pointButton = UIButton()
pointButton.frame = point.bounds
self.buttonLocationWithIndex[point.frame] = index
self.view.addSubview(pointButton)
我在尝试声明字典时遇到错误:Type 'CGRect' does not confirm to protocol 'Hashable'
更新
func pressed(sender: UIButton!)
var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
var boundsIndex = self.buttonLocationWithIndex[sender.frame]
var value = self.points(boundsIndex)
alertView.message = value
alertView.show();
错误: Cannot invoke points with an arguments list of type (Int?)'
【问题讨论】:
self.points(boundsIndex) 需要为 self.points[boundsIndex] 【参考方案1】:更新(2021-11-01): 对接受的答案进行了编辑,以提供与我类似的解决方案,因此它也可以工作。
这是一个老问题,但由于我最近需要这个,我认为这对其他人可能有用。
目前在 Swift 5 中为 CGRect 实现 Hashable 协议的方式是:
import UIKit
extension CGRect: Hashable
public func hash(into hasher: inout Hasher)
hasher.combine(minX)
hasher.combine(minY)
hasher.combine(maxX)
hasher.combine(maxY)
来源:https://developer.apple.com/documentation/swift/hashable
【讨论】:
【参考方案2】:通过扩展在CGRect
上实现Hashable
协议。
extension CGRect: Hashable
public func hash(into hasher: inout Hasher)
hasher.combine(origin.x)
hasher.combine(origin.y)
hasher.combine(size.width)
hasher.combine(size.height)
它将允许您使用CGRect
作为密钥。
【讨论】:
我在同一个班级试过这个,但我得到一个错误:Use of unresolved identifier 'NSStringFromRect'
你导入 Foundation 了吗?
你能发布更多代码吗?这是一个工作示例swiftstub.com/963578307/?v=gm
@ABakerSmith 不,你可以在这里查看developer.apple.com/library/mac/documentation/Cocoa/Reference/…
@Tomáš Linhart,说NSStringFromRect
需要NSRect
,而不是CGRect
。以上是关于Swift:字典键为 CGRect的主要内容,如果未能解决你的问题,请参考以下文章