Swift中集合类型indexOf(Element)提示错误的解决办法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
初学Swift,会遇到一些潜在的小问题,比如我们在某个集合对象中查找一个元素的时候会用到indexOf方法.
在API文档里可以看到该方法有2个重载:
indexOf(_: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Index?
indexOf(_: Self.Generator.Element) -> Self.Index?
Default Implementation
可以看到一个简单,一个复杂.我们这次把简单的留到后面先看复杂的那个方法签名,也就是第一个.该方法需要传递一个闭包,该闭包有唯一一个参数为Self.Generator.Element类型,返回一个Bool类型.
下面我们在playground里写一个测试类Person:
class Person{
let name:String
let age:Int
init(name:String,age:Int){
self.name = name
self.age = age
}
}
接下来我们创建一个包含2个Person对象的数组people:
var p1 = Person(name: "Tom", age: 11)
var p0 = Person(name: "Bob", age: 121)
let people = [p0,p1]
然后我们想在people中找到name为Tom的Person,使用indexOf的第一种重载,可以这么写:
let idx = people.indexOf({(p:Person) in
return p.name == p1.name
})
不出意料,idx是1,我们还可以写的更简单些:
let idx = people.indexOf {$0.name == p1.name}
好了,现在复杂的搞定了,回过头再看看那个简单的重载,我们直接这样调用:
let idx = people.indexOf(p0)
神马!?简单的竟然出错了!
这该如何是好?其实看一下错误描述,大概就可以猜到Swift此时不知道你自定义类是如何比较的,如果是Swift内置的各种struct和class就不存在这个问题,比如:
var ary = [1,2,3,4]
let idx = ary.indexOf(3) //idx will be 2
解决很简单,添加一个==方法即可:
class Person:Equatable {
let name:String
let age:Int
init(name:String,age:Int){
self.name = name
self.age = age
}
}
func ==(p0:Person,p1:Person)->Bool{
return p0.name == p1.name && p0.age == p1.age
}
var p1 = Person(name: "Tom", age: 11)
var p0 = Person(name: "Bob", age: 121)
let people = [p0,p1]
let idx = people.indexOf(p0)
最后补充一下,早期版本的Swift还有一个find函数可以完成类似的功能,但是新版本已经没有该函数了,So你懂的…
Swift中集合类型indexOf(Element)提示错误的解决办法的更多相关文章
- “sockaddr”: “struct”类型重定义的错误的解决办法《转》
原帖地址:https://blog.csdn.net/clever101/article/details/100163301 windows.h和winsock2.h存在有类型重定义,往往体现在VC程 ...
- maven提示错误的解决办法
import或者new一个的maven project的时候,提示如下错误 Description Resource Path Location TypeCannot read ...
- 当AVPlayer在被释放之后,Player一直监听的时间没有被移除,提示错误的解决办法
Xcode Consolu打印出来的提示: An instance 0x156608c0 of class AVPlayer was deallocated while key value obser ...
- Vs Code在Vue项目中v-for指令提示错误的解决办法
最近在做一个Vue项目,在其中用到v-for指令时,发现Vs Code报错,如下图(代码是没有任何问题的),在网上找了一下解决办法,希望能帮助到更多人. 解决方法: 打开 文件-首选项-设置 将 ...
- “cvc-complex-type.2.4.a: Invalid content was found starting with element 'taglib'”错误的解决办法
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" ...
- VS Code使用.vue的v-for方法提示错误的解决办法
1.在使用v-for的时候在后面跟上:key="key" <div v-for="(value, key) in [1,2,3]" :key=" ...
- Xamarin 中Visual Studio创建项目提示错误
Xamarin 中Visual Studio创建项目提示错误 错误信息:Object reference not set to an instance of an object 出现这种情况,是由于没 ...
- Swift中的类型属性(静态变量)
http://blog.haohtml.com/archives/15098 Swift中的类型属性(静态变量) Posted on 2014/06/13 类型属性语法 在 C 或 Objective ...
- Hive中集合类型
Hive中集合类型 创建表,集合是以 - 分割的 数据文件 加载数据 查询数据 查询数组中第一个字段 再建一个表,使用map 查看数据文件 加载数据 查询数据 查询键值 创建表,struct类型 查看 ...
随机推荐
- [HNOI 2003]消防局的设立
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...
- 计蒜客NOIP模拟赛4 D1T1 小X的质数
小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1以外,没有其他因数的数字. 但由于小 X ...
- ●BZOJ 2752 [HAOI2012]高速公路(road)
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2752题解: 期望,线段树. 把每个路段看成一个点,那么对于l~R的操作,就可以转化为对l~r ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
- Chinese-Text-Classification:Tensorflow CNN 模型实现的中文文本分类器[不分词版]
从现在的结果来看,分词的版本准确率稍微高一点. 训练过程: 模型评估: 实验三,准备换一下数据集,用这里的数据集来跑这个模型:https://zhuanlan.zhihu.com/p/30736422 ...
- kibana使用
最近,被老大叫写一个kibana的使用方法给所有人用. 注意的一点: 能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意 ...
- MySQL中UTF8编码的数据在cmd下乱码
MySQL中UTF8编码的数据在cmd下乱,在数据库ide中看到的却是中文. 其实,原因是cmd用gbk的格式来显示数据,那么我们只需要将utf-8存储的数据用gbk的格式输出到cmd即可. 解决方法 ...
- Head First Java设计模式思维导图总结
关于Head First Java设计模式的思维导图总结:
- js中一个对象当做参数传递时候?
高程中讲到:'ECMAScript 中所有函数的参数都是按值传递'. 这就像把值从一个变量复制到另一个变量一样. 那引用类型的值也是像基本类型一样? 直接看栗子一: var person = { na ...
- PostOffice最小距离问题
在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中.用x 坐标表示东西向,用y坐标表示南北向.各居民点的位置可以由坐标(x,y)表示. 街区中任意2 点(x1,y1)和 ...