Swift:字典键为 CGRect

Posted

技术标签:

【中文标题】Swift:字典键为 CGRect【英文标题】:Swift: Dictionary Key as CGRect 【发布时间】:2015-07-10 23:31:50 【问题描述】:

我需要将buttonframe 保存为键,并将数组中的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的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 通过外键将数组映射到字典

C#:对键为 List<object> 的字典进行排序

Python怎么排序字典,当字典里的值都是一个类的实例化对象,键为不同的字符串,根据实例化对象的值x排序

Python字典

python基础三(字典)

Python进阶3