Swift心得笔记之运算符
空值合并运算符和区间运算符
今天主要看的内容是Swift中的基本运算符。记录一下。
NilCoalescingOperator
a??b中的??就是是空值合并运算符,会对a进行判断,如果不为nil则解包,否则就返回b。
vara:String?="a" varb:String?="b" varc=a??b//"a" a=nil c=a??b//"b" b=nil c=a??b??"c"//"c"
使用的时候有以下两点要求:
a必须是optional的
b必须和a类型一致
也就是说,a一定要有被备胎的可能,b一定要有做备胎的资格。
其实也就是对三目运算符的简写:
a!=nil?a!:b或者a==nil?b:a!
当然你也可以通过自定义运算符来实现:
infixoperator|||{}
func|||<T>(left:T?,right:T)->T{
ifletl=left{
returnl
}
returnright
}
vara:String?
varb="b"
varc=a|||b
C#中也有个??,感兴趣的可以去了解一下。
RangeOperator
区间运算符分为闭区间(...)和左闭右开区间(..<)两种,前者是算头算尾,后者是算头不算尾。
可以应用在switch中:
switchaNumber
{
case0...5:
println("Thisnumberisbetween0and5")
case6...10:
println("Thisnumberisbetween6and10")
default:
println("Thisnumberisnotbetween0and10")
}
区间运算符其实返回的是一个Range<T>对象,是一个连续无关联序列索引的集合。
话说以前左闭右开是..,这样和Ruby的就刚好完全相反了。。。
不过有人就是想用..,那么可以这样自己写一个:
infixoperator..{associativitynoneprecedence135}
func..(lhs:Int,rhs:Int)->Range<Int>{
returnlhs..<rhs
}
foriin0..10{
println("index\(i)")
}
你也可以用generate()来遍历:
varrange=1...4
vargenerator=range.generate()//{startIndex1,endIndex5}
generator.next()//1
generator.next()//2
generator.next()//3
generator.next()//4
generator.next()//nil
.generate()返回一个RangeGenerator<T>的结构体,可以用来遍历Range<T>中的值。
以前还有个(5...1).by(-1)的用法,不过现在好像没用了。
区间运算符返回的是一个ClosedInterval或者HalfOpenInterval的东西,类型只要是Comparable就可以了。所以我们也可以把String放到...里。
比如猫神的SwifterTips中有一章的代码如下,通过String的ClosedInterval来输出字符串中的小写字母:
lettest="Hello"
letinterval="a"..."z"
forcintest{
ifinterval.contains(String(c)){
println("\(c)")
}
}
SubString
Ruby中用点点点来获取SubString的方法很方便:
2.1.3:001>a="abc" =>"abc" 2.1.3:002>a[0] =>"a" 2.1.3:003>a[0..1] =>"ab"
而Swift中的ClosedInterval是没有subscript的。但是任性的我们就是要用[1...3]这种方法怎么办呢?
自己动手丰衣足食,写个extension吧,只需要加个subscript就可以了,然后下标的类型是Range<Int>就可以了:
extensionString{
subscript(r:Range<Int>)->String{
get{
letstartIndex=advance(self.startIndex,r.startIndex)
letendIndex=advance(startIndex,r.endIndex-r.startIndex)
returnself[Range(start:startIndex,end:endIndex)]
}
}
}
vars="Hello,playground"
println(s[0...5])//==>"Hello,"
println(s[0..<5])//==>"Hello"
如果要搜索目标字符串之后再截取substring可以这样:
letname="JorisKluivers"
letstart=name.startIndex
letend=find(name,"")
if(end!=nil){
letfirstName=name[start..<end!]
}else{
//nospacefound
}
以上所述就是本文的全部内容了,希望大家能够喜欢。