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类型 查看 ...
随机推荐
- ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4596 题解: 容斥,矩阵树定理,矩阵行列式 先说说容斥:(一共有 N-1个公司) 令 f[i ...
- bzoj4830 hnoi2017 抛硬币
题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...
- [Noi2016]网格
来自FallDream的博客,未经允许,请勿转载,谢谢. 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐, ...
- python中的赋值操作和复制操作
之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...
- 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控
[写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...
- sprintf()、fprintf()、fscanf()的用法
sprintf函数的用法1.该函数包含在stdio.h的头文件中. 2.sprintf和平时我们常用的printf函数的功能很相似.sprintf函数打印到字符串中,而printf函数打印输出到屏幕上 ...
- php留言板的实现
留言板功能的实现,主要就是通过编程语言对数据库进行操作,简单说也就是插入和查询的实现.不管是什么语言进行实现,道理都是一样的. 应学习需要,这里用php世界上最美的语言来进行实现. 主要步骤为: 连接 ...
- log4j的终极封装
通用型(再也不用每个类new一个logger了) public class Log { private static Map<String,Logger> loggerMap = new ...
- 数据结构之Treap
1. 概述 同splay tree一样,treap也是一个平衡二叉树,不过Treap会记录一个额外的数据,即优先级.Treap在以关键码构成二叉搜索树的同时,还按优先级来满足堆的性质.因而,Treap ...
- Javascript面向对象编程(一):封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...