是否有一种特定的方法在swift中使用元组作为set元素?(代码片段)

author author     2023-05-13     279

关键词:

我想对x-y网格中的坐标对元素进行集合运算。例如。 (0,0),(1,4),(1,5),(2,3)与(2,3),(1,4),(2,6)的联合= (0 ,0),(1,4),(1,5),(2,3),(2,6)遗憾的是我无法找到一种将元组插入Swift的Set命令的方法,因为它说他们做了不符合'hashable'协议。我相信我有一个解决方法,但它涉及很多代码。在我碰到磨刀石之前,有没有一种简单的方法让我失踪?

我是iOS框架的新手,所以我目前正在尝试在Swift中做所有事情。这可能是我的问题......

答案

而不是使用元组来表示点,使用内置类型CGPoint。您可以通过扩展CGPoint来扩展它:

import UIKit

extension CGPoint: Hashable 
    public var hashValue: Int 
        return self.x.hashValue << sizeof(CGFloat) ^ self.y.hashValue
    


// Hashable requires Equatable, so define the equality function for CGPoints.
public func ==(lhs: CGPoint, rhs: CGPoint) -> Bool 
    return CGPointEqualToPoint(lhs, rhs)

既然CGPoint是Hashable,你可以在套装中使用它。例如:

let point1 = CGPoint(x: 0, y: 1)
let point2 = CGPoint(x: 0, y: 2)
let point3 = CGPoint(x: 1, y: 1)
let point4 = CGPoint(x: 3, y: 3)
let point5 = CGPoint(x: 3, y: 3)  // Intentionally the same as point4 to see the effect in union and difference.

let set1 = Set([point1, point2 , point5])
let set2 = Set([point4, point3])

let union = set1.union(set2) // -> x 0 y 2, x 3 y 3, x 0 y 1, x 1 y 1
let difference = set1.intersect(set2) // -> x 3 y 3
另一答案

干得好:

class Pair 
    var x: Int
    var y: Int
    init(x: Int, y:Int)
        self.x = x
        self.y = y
    

    func isExisted(inPairs pairs:[Pair]) -> Bool 
        for p in pairs 
            if p.y == self.y && p.x == self.x
                return true
            
        
        return false
    

    static func union (pairs1: [Pair], pairs2: [Pair]) -> [Pair] 
        var pairsFinal = [Pair]()

        for p in pairs1 
            pairsFinal.append(p)
        

        for p in pairs2 
            if !p.isExisted(inPairs: pairsFinal)
                pairsFinal.append(p)
            
        
        return pairsFinal
    


let pari1 = Pair(x: 4, y: 7)
let pair2 = Pair(x: 5, y: 2)
let pair3 = Pair(x: 4, y: 7)
let pair4  = Pair(x: 3, y: 9)

let pairs1 = [pari1, pair2]
let pairs2 = [pair3, pair4]

let f = Pair.union(pairs1, pairs2: pairs2)

这是工会的结果:

enter image description here

另一答案

你可以把struct作为Hashable类型:

struct Point: Hashable 
  let x: Int
  let y: Int

既然你有一个可清除的元组,可以使用正常的Set操作:

let set1 = Set([
  Point(x:0,y:0),
  Point(x:1,y:4),
  Point(x:1,y:5),
  Point(x:2,y:3)
]) 

let set2 = Set([
  Point(x:2,y:3),
  Point(x:1,y:4),
  Point(x:2,y:6)
])

let setUnion = set1.union(set2)

/*
setUnion = 
  Point(x: 1, y: 5), 
  Point(x: 0, y: 0), 
  Point(x: 1, y: 4), 
  Point(x: 2, y: 3), 
  Point(x: 2, y: 6)

*/

是否有一种特定的方法来处理循环python中的错误

】是否有一种特定的方法来处理循环python中的错误【英文标题】:Isthereanspecificwaytotreaterrorinlooppython【发布时间】:2022-01-2107:09:42【问题描述】:我找到了一个笔记本,但我卡在了这一点上[10]:importpandasaspd使用API循环遍历轨道UR... 查看详情

在 Swift 中是不是有一种简洁的方法可以将完成块附加到 NSURLSessionDataDelegate 回调?

...tachaCompletionBlocktoanNSURLSessionDataDelegateCallbackinSwift?在Swift中是否有一种简洁的方法可以将完成块附加到NSURLSessionDataDelegate回调?【发布时间】:2015-06-1421:12 查看详情

是否有一种速记方法来更新球拍中的特定结构字段?

】是否有一种速记方法来更新球拍中的特定结构字段?【英文标题】:Isthereashorthandwaytoupdateaspecificstructfieldinracket?【发布时间】:2015-04-2011:59:25【问题描述】:假设我有一个包含许多字段的结构:(structmy-struct(f1f2f3f4))如果我要返... 查看详情

在 swift 中使用协议作为数组类型和函数参数

...化数组中。根据Swift文档协议,可以用作类型:因为它是一种类型,所以你可以在许多允许其他类型的地方使用协议,包括:作为函数、方法或初始化程序中 查看详情

在bash中循环元组?

...ertuplesinbash?【发布时间】:2012-03-3113:40:38【问题描述】:是否可以在bash中循环元组?例如,如果以下方法可行,那就太好了:for(i,j)in((c,3),(e,5));doecho"$iand$j";done是否有一种解决方法可以让我循环遍历元组?【问题讨论】:来自pyt... 查看详情

Javascript:使用元组作为字典键

...ctionarykeys【发布时间】:2010-11-2808:27:36【问题描述】:我有一种情况,我想创建从元组到整数的映射。在python中,我会简单地使用元组(a,b)作为字典的键,Javascript有元组吗?我发现javascript中的(a,b)作为表达式只返回b(最后一项... 查看详情

在故事板中使用 Swift 嵌套类作为 UIViewController

...ard【发布时间】:2019-11-2207:57:06【问题描述】:你们知道是否可以在Storyboard中使用Swift嵌套类作为UIViewController吗?我正在研究构建项目的不同方法,其中一种是通过将相关类嵌套在同一个主类中来对它们进行分组。让我用一 查看详情

是否有一种标准化的方法可以在 Python 中交换两个变量?

】是否有一种标准化的方法可以在Python中交换两个变量?【英文标题】:IsthereastandardizedmethodtoswaptwovariablesinPython?【发布时间】:2013-01-2723:26:11【问题描述】:在Python中,我已经看到使用这种语法交换了两个变量值:left,right=right... 查看详情

为啥我不能在 switch 语句中使用元组常量作为案例

】为啥我不能在switch语句中使用元组常量作为案例【英文标题】:Whycan\'tIuseatupleconstantasacaseinaswitchstatement为什么我不能在switch语句中使用元组常量作为案例【发布时间】:2015-04-1614:35:57【问题描述】:我决定使用Swift案例语句和... 查看详情

Xcode/Swift 中的颜色和主题

...具栏是黑色的。标签是白色的。按钮为绿色或蓝色。等等是否有一种很好且有效的方法可以在代码中的某处定义“主题颜色”并使用这些变量而不是 查看详情

是否有一种解决方法可以使用 getLeaderboardIntent() 获取公共排行榜?

】是否有一种解决方法可以使用getLeaderboardIntent()获取公共排行榜?【英文标题】:IsthereaworkaroundtogetthepublicLeaderboardwithgetLeaderboardIntent()?【发布时间】:2014-02-2407:05:30【问题描述】:打开包含特定排行榜的GoogleGames活动非常简单... 查看详情

具有每种特定颜色的特定字母?

...rs?【发布时间】:2014-11-1905:46:06【问题描述】:我想知道是否有一种方法可以使用Swift编程语言使每个单词中的字母都着色。我正在寻找想法和线索。例子:println("Thisisastring")看起来像这样:如果这有帮助,我发现其他语言能够... 查看详情

TypeScript 中是不是有一种编译时方法来声明一个 keyof 类型,只有映射到特定类型的键? [复制]

...lareakeyoftype,ofonlythekeysthatmaptoaspecifictype?[duplicate]TypeScript中是否有一种编译时方法来声明一个keyof类型,只有映射到特定类型的键?[复制]【发布时间】:202 查看详情

是否有一种优雅的方法可以在 SQL 插入语句中反转位值?

】是否有一种优雅的方法可以在SQL插入语句中反转位值?【英文标题】:IsthereanelegantwaytoInvertaBitvalueinanSQLinsertStatement?【发布时间】:2011-03-2011:32:15【问题描述】:我正在SQLServer中转换一些数据:INSERTINTOMYTABLE(AllowEdit)(SelectPreventE... 查看详情

是否有一种 FastAPI 方法可以在全球范围内访问当前的请求数据?

】是否有一种FastAPI方法可以在全球范围内访问当前的请求数据?【英文标题】:IsthereaFastAPIwaytoaccesscurrentRequestdataglobally?【发布时间】:2019-12-0321:09:13【问题描述】:在FastAPI框架内:虽然请求数据当然可以作为参数传递,但我... 查看详情

是否有一种简洁的方法可以为同一个扩展定义两个或多个 bash 别名?

】是否有一种简洁的方法可以为同一个扩展定义两个或多个bash别名?【英文标题】:Isthereaconcisewaytodefinetwoormorebashaliasesforthesameexpansion?【发布时间】:2020-02-2802:55:04【问题描述】:假设我想同时使用e和c作为在首选编辑器中打开... 查看详情

测试是不是在任何外部表条目中使用特定 id 作为外键

...标题】:testifaspecificidisusedasforeignkeyinanyforeigntableentry测试是否在任何外部表条目中使用特定id作为外键【发布时间】:2011-11-2821:46:19【问题描述】:我有一个表“用户”,其中有一列“id”。此id在许多其他表(如帖子、cmets等)... 查看详情

是否有一种优雅的内置方法可以在 R 中进行模索引?

】是否有一种优雅的内置方法可以在R中进行模索引?【英文标题】:Isthereanelegant,built-inwaytodomoduloindexinginR?【发布时间】:2018-04-0812:16:14【问题描述】:目前,我有extract_modulo=function(x,n,fn=`[`)fn(x,(n-1L)%%length(x)+1L)`%[mod%`=function(x,n)e... 查看详情