Swift 3.0基础学习之枚举类型
枚举语法
使用关键字enum定义一个枚举
enumSomeEnumeration{
//enumerationdefinitiongoeshere
}
例如,指南针有四个方向:
enumCompassPoint{
casenorth
casesouth
caseeast
casewest
}
这里跟c和objective-c不一样的是,Swift的枚举成员在创建的时候没有给予默认的整型值。所以上面代码中的东南西北并不是0到3,相反,不同的枚举类型本身就是完全成熟的值,具有明确定义的CompassPoint类型。
也可以声明在同一行中:
enumPlanet{
casemercury,venus,earth,mars,jupiter,saturn,uranus,neptune
}
枚举赋值:
vardirectionToHead=CompassPoint.west
一旦directionToHead明确为CompassPoint类型的变量,后面就可以使用点语法赋值:
directionToHead=.east
Switch表达式的枚举值匹配
switch表达式如下:
directionToHead=.south
switchdirectionToHead{
case.north:
print("Lotsofplanetshaveanorth")
case.south:
print("Watchoutforpenguins")
case.east:
print("Wherethesunrises")
case.west:
print("Wheretheskiesareblue")
}
//Prints"Watchoutforpenguins"
当然这里也可以加上default以满足所有的情况:
letsomePlanet=Planet.earth
switchsomePlanet{
case.earth:
print("Mostlyharmless")
default:
print("Notasafeplaceforhumans")
}
//Prints"Mostlyharmless"
关联值
在Swift中,使用枚举来定义一个产品条形码:
enumBarcode{
caseupc(Int,Int,Int,Int)
caseqrCode(String)
}
可以这样理解上面这段代码:定义一个叫Barcode的枚举类型,带有值类型(Int,Int,Int,Int)的upc和值类型(String)
现在可以这样创建其中一种类型的条形码:
varproductBarcode=Barcode.upc(8,85909,51226,3)
同一产品的另外一个类型的条形码可以这样赋值:
productBarcode=.qrCode("ABCDEFGHIJKLMNOP")
可以用switch来查看两种不同的条形码类型:
switchproductBarcode{
case.upc(letnumberSystem,letmanufacturer,letproduct,letcheck):
print("UPC:\(numberSystem),\(manufacturer),\(product),\(check).")
case.qrCode(letproductCode):
print("QRcode:\(productCode).")
}
//Prints"QRcode:ABCDEFGHIJKLMNOP."
上面的写法也可以改为:
switchproductBarcode{
caselet.upc(numberSystem,manufacturer,product,check):
print("UPC:\(numberSystem),\(manufacturer),\(product),\(check).")
caselet.qrCode(productCode):
print("QRcode:\(productCode).")
}
//Prints"QRcode:ABCDEFGHIJKLMNOP."
原始值
这里是一个保存原始ASCII值的枚举类型:
enumASCIIControlCharacter:Character{
casetab="\t"
caselineFeed="\n"
casecarriageReturn="\r"
}
和上面关联值类似,在枚举中也可以指定每个case的默认值(rawvalues)。
值得注意的是,原始值和关联值不一样,原始值是在第一次定义枚举代码的时候已经设置好的,所有同类型的枚举case的原始值都是一样的。而关联值是你创建一个基于枚举case新的常量或者变量的时候设置的,可以在每次你创建的时候都使用不一样的值。
隐式分配的原始值
如果枚举中case的原始值是整型或者字符串的时候,你不需要给每个case分配原始值,Swift会自动帮你分配好值。
例如:
enumPlanet:Int{
casemercury=1,venus,earth,mars,jupiter,saturn,uranus,neptune
}
Planet.mercury原始值为1,Planet.venus拥有一个隐式的原始值为2,以此类推。
如果枚举的原始值是string类型,那么他的原始值就是case名称的文本,例如:
enumCompassPoint:String{
casenorth,south,east,west
}
CompassPoint.south的隐式原始值是"south",以此类推。
letearthsOrder=Planet.earth.rawValue
//earthsOrderis3
letsunsetDirection=CompassPoint.west.rawValue
//sunsetDirectionis"west"
从原始值初始化
如果你定义一个原始值类型的枚举,这时枚举会自动创建一个带有原始值类型的初始化器(参数名称为rawValue),例如:
letpossiblePlanet=Planet(rawValue:7) //possiblePlanetisoftypePlanet?andequalsPlanet.uranus
不是所有的Int值都可以找到对应的planet,所以原始值初始化器会返回一个optional的枚举case,上面的例子中的possiblePlanet是Planet?类型。
如果你想找原始值为11的planet,初始化器将返回nil:
letpositionToFind=11
ifletsomePlanet=Planet(rawValue:positionToFind){
switchsomePlanet{
case.earth:
print("Mostlyharmless")
default:
print("Notasafeplaceforhumans")
}
}else{
print("Thereisn'taplanetatposition\(positionToFind)")
}
//Prints"Thereisn'taplanetatposition11"
递归枚举
递归枚举是一个包含有一个或多个枚举case的关联值枚举实例的枚举,使用关键字indirect标明某个枚举case是递归的。
例如,下面是一个保存简单算法表达式的枚举:
enumArithmeticExpression{
casenumber(Int)
indirectcaseaddition(ArithmeticExpression,ArithmeticExpression)
indirectcasemultiplication(ArithmeticExpression,ArithmeticExpression)
}
你也可以直接把indirect写在枚举定义的最前面:
indirectenumArithmeticExpression{
casenumber(Int)
caseaddition(ArithmeticExpression,ArithmeticExpression)
casemultiplication(ArithmeticExpression,ArithmeticExpression)
}
下面的代码是示例如何创建这个递归枚举:
letfive=ArithmeticExpression.number(5) letfour=ArithmeticExpression.number(4) letsum=ArithmeticExpression.addition(five,four) letproduct=ArithmeticExpression.multiplication(sum,ArithmeticExpression.number(2))
应用到计算函数中:
funcevaluate(_expression:ArithmeticExpression)->Int{
switchexpression{
caselet.number(value):
returnvalue
caselet.addition(left,right):
returnevaluate(left)+evaluate(right)
caselet.multiplication(left,right):
returnevaluate(left)*evaluate(right)
}
}
print(evaluate(product))
//Prints"18"
上面例子的算法表达式是:(5+4)*2,结果为18
参考英语原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID145
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Swift能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。