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 }
以上所述就是本文的全部内容了,希望大家能够喜欢。