Swift中集合类型indexOf(Element)提示错误的解决办法
2016-04-01 14:42
633 查看
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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)提示错误的解决办法
- Swift中的as操作符
- Swift中的as操作符
- Swift中的as操作符
- Swift UISwitch/UIProgressView/UISlider
- swift字符串
- Swift语言教程中文文档
- Swift生成二维码
- Swift 初识
- swift开发笔记28 使用系统自带地图
- iOS开发——swift篇&经典语法(二十)高级运算符
- swift学习笔记之UIImageView
- Swift_之沙盒与数据存储
- Swift之可选数据类型
- 对照Java学习Swift--枚举(Enumerations)
- Swift系统自带二维码的扫描使用
- swift 数组转字符串(joinWithSeparator)
- 关于 swift 开发的变量或属性声明的建议(避免类型转换以及带来的强转崩溃问题)
- swift - 访问控制
- Swift编程基础(二):字符与字符串