基础部分
Swift的类型是在C和Objective-C的基础上改进,Int是整型,Double和Float是浮点型,Bool是布尔型,String是字符串,Array和Dictionary是集合,还有一些其他语言没有的比如元组,元组可以创建或传递一组数据,比如作为函数的返回值,可以用元组来返回多个值 Swift增加了可选类型(Optional),用于处理值的缺省情况,类似OC中的nil,可以用在任何类型上,不仅是类 Swift是一个类型安全的语言,可选(Optional)就是很好的例子,可让你清楚的知道一个值的类型,如果期望得到一个String,类型安全会阻止你以外的传入一个Int,并且可以在开发的时候就发现这种错误
Swift增加了可选类型(Optional),用于处理值的缺省情况,类似OC中的nil,可以用在任何类型上,不仅是类 Swift是一个类型安全的语言,可选(Optional)就是很好的例子,可让你清楚的知道一个值的类型,如果期望得到一个String,类型安全会阻止你以外的传入一个Int,并且可以在开发的时候就发现这种错误
1.常量和变量
变量和常量在使用前必须先定义,变量使用var定义,常量使用let定义,常量的值一旦设定不能再改变,而变量可以多次赋值
- letmaximumNumberOfLoginAttempts=10
- varcurrentLoginAttempt=0
以上例子中,看定义的名称大约也可以猜出来是什么意思了,定义一个不可变的常量,表示最大的登录尝试次数,定义一个变量,表示当前已经尝试过的登录次数
也可以在一行中定义多个变量或常量
varx=0.0,y=0.0,z=0.0
2.类型标注
可以在定义常量或变量的时候提供一个类型标注,指明所定义的值是什么类型的,在变量或常量后面添加一个冒号,其次是类型名称,以下是定义了一个变量,类型是字符串String类型
varwelcomeMessage:String
然后这个字符串变量又可以随意赋其他的值了
welcomeMessage="Hello"
一般来说添加类型注释是比较少用的,如果你在定义的时候提供了一个初始值,那编译器就会识别定义的变量或常量的类型,而不需要再指定
变量名或常量名可以使用unicode字符
letπ=3.14159
- let你好="你好世界"
虽然说可以使用unicode来定义,但也要遵守一些规则,不能使用数学运算符,箭头,代码点还有一些什么畸形的符号什么的(保留的或非法的Unicode码),也不能以数字开头
一旦确定了一个常量或变量的类型,就不能再用相同的名字再定义了,或存储不同类型的值,也不能把变量改为常量,也不能把常量改为变量
变量可以再赋一个相同类型的值,而常量一旦设定就不能再改变了
varfriendlyWelcome="Hello!"
- friendlyWelcome="Bonjour!"
-
- letlanguageName="Swift"
- languageName="Swift++"
-
使用println方法打印,就像Objective-C里的NSLog,使用反斜线和小括号显示变量
println("Thisisastring")
- println("ThecurrentvalueoffriendlyWelcomeis(friendlyWelcome)")
注释,跟其他类型语言的注释一样,自己体会
//thisisacomment
- /*thisisalsoacomment,
- butwrittenovermultiplelines*/
- /*thisisthestartofthefirstmultilinecomment
- /*thisisthesecond,nestedmultilinecomment*/
- thisistheendofthefirstmultilinecomment*/
分号,分号在这里已经不是必须的了,不过也要分清场合,如果你要在一行写多个语句,分号就不能省了
letcat="cat";println(cat)
3.整数
整数就是没有小数部分的数字,可以使有符号(正、负、零)和无符号(正、零) Swift提供了8、16、32和64位的有符号和无符号整数类型,分别命名为Uint8,UInt16,UInt32,UInt64
整数范围
访问不同类型的min和max属性来获取相应类型的最小和最大值
letminValue=UInt8.min
- letmaxValue=UInt8.max
Int
Swift提供一个特殊的整数类型Int,长度根据当前系统的字长相同,不需专门指定,在32位平台上,Int长度和Int32相同,在64位平台上,Int长度和Int64相同,Int32的存储范围为 -2147483648~2147483647
UInt
无符号类型,但尽量不要用,除非真的需要存储一个跟当前平台字长相同的无符号整数,推荐使用Int
浮点数
有小数部分的数字,浮点类型比整数类型表示的范围更大,Swfit有两种:Double,表示64位浮点数,精度至少有15位,当需要存储很大或者精度很高的浮点数时使用,Float,表示32位浮点数,只有6为数字的精度
4.类型安全和类型推测
Swift是类型安全的语言,可让你清楚的知道代码需要处理的值得类型,如果代码需要一个String,绝不可能传入Int,如果遇到不匹配就会报错,在开发的时候就可以看到 如果没有显示指定类型,Swift会使用类型推测来选择合适的类型,编译器会根据你赋的值来自动推测表达式的类型 举例如果给一个常量赋值42但没有标明类型,Swift会推出类型是Int
letmeaningOfLife=42
- //meaningOfLifeisinferredtobeoftypeInt
如果没有给浮点数标明类型,Swift会推出类型是Double,当推测浮点数时,优选选择Double而不是Float
letpi=3.14159
- //piisinferredtobeoftypeDouble
- letanotherPi=3+0.14159
- //anotherPiisalsoinferredtobeoftypeDouble
5.进制表示法
以下是用十进制、二进制、八进制和十六进制来表示17
letdecimalInteger=17
- letbinaryInteger=0b10001
- letoctalInteger=0o21
- lethexadecimalInteger=0x11
6.Numberic Type Conversion 数值类型转换
Integer Conversion整数的转换
每种数值类型能表示的数字范围是不一样的,Int8能表示的范围是-128到127之间,UInt8能表示的范围为0到255之间,如果赋的值与数值类型不一致将会在编译的时候报错
letcannotBeNegative:UInt8=-1
- //UInt8cannotstorenegativenumbers,andsothiswillreportanerror
- lettooBig:Int8=Int8.max+1
- //Int8cannotstoreanumberlargerthanitsmaximumvalue,
- //andsothiswillalsoreportanerror
因为每个数值类型都可以存储不同范围的值,所以必须在转换的时候指定一个数值类型,以防止转换错误
以下例子中,2000是UInt16类型,1是UInt8类型,如果想要两数相加操作,需要把把他们转换为同一种类型
twoThousand:UInt16=2_000
- letone:UInt8=1
- lettwoThousandAndOne=twoThousand+UInt16(one)
Integer and Floating-Point Conversion 整数和浮点数之间的转换
letthree=3
- letpointOneFourOneFiveNine=0.14159
- letpi=Double(three)+pointOneFourOneFiveNine
- //piequals3.14159,andisinferredtobeoftypeDouble
在这里,3由Int型转换为Double型,这样两种类型相同才能相加,否则编译不通过
反过来,浮点数转换为整数会丢失精度
letintegerPi=Int(pi)
- //integerPiequals3,andisinferredtobeoftypeInt
7.Type Aliased 类型别名
类似linux中的alias,可以给类型取别名,给类型取别名后就可以直接使用它的属性
typealiasAudioSample=UInt16
- varmaxAmplitudeFound=AudioSample.min
- //maxAmplitudeFoundisnow0
8.Booleans 布尔类型
letorangesAreOrange=true
- letturnipsAreDelicious=false
-
- ifturnipsAreDelicious{
- println("Mmm,tastyturnips!")
- }else{
- println("Eww,turnipsarehorrible.")
- }
- //prints"Eww,turnipsarehorrible."
-
- leti=1
- ifi{
- //thisexamplewillnotcompile,andwillreportanerror
- }
- ifi==1{
- //thisexamplewillcompilesuccessfully
- }
9.Tuples 元组
元组相当于一个key对应多个value,把多个值组合成一个复合值,value的类型可以是不同的
lethttp404Error=(404,"NotFound")
- //http404Errorisoftype(Int,String),andequals(404,"NotFound")
- let(statusCode,statusMessage)=http404Error
- println("Thestatuscodeis(statusCode)")
- //prints"Thestatuscodeis404"
- println("Thestatusmessageis(statusMessage)")
- //prints"ThestatusmessageisNotFound"
如果元组内有值没有用到,用下划线 _ 来省略
let(justTheStatusCode,_)=http404Error
- println("Thestatuscodeis(justTheStatusCode)")
- //prints"Thestatuscodeis404"
也可以使用下标代替元组的值,下标从0开始
println("Thestatuscodeis(http404Error.0)")
- //prints"Thestatuscodeis404"
- println("Thestatusmessageis(http404Error.1)")
- //prints"ThestatusmessageisNotFound"
在定义元组的同时就把名字给取好了,取值的时候就是元组加属性了
lethttp200Status=(statusCode:200,description:"OK")
- println("Thestatuscodeis(http200Status.statusCode)")
- //prints"Thestatuscodeis200"
- println("Thestatusmessageis(http200Status.description)")
- //prints"ThestatusmessageisOK"
作为函数返回值,元组非常有用,相比只能返回一个类型的值比起来,元组能让函数返回值更丰富
10.Optional 可选
使用Optional来处理值可能缺失的情况,一个方法要么返回一个对象,要么返回nil,但这只对对象起作用,对结构体、基本C类型或者枚举类型不起作用,OC方法一般会返回一个特殊值表示值的缺失,然而Swift的Optional可让你暗示任意值的缺失,而不需要特殊的值 例子:String有个toInt的方法将String类型转换为Int类型,但是toInt方法可能会失败,所以返回的是一个Optional的Int,而不是一个Int,Optional的Int写作 Int? 问号表示包含的值是可选的,可能有值也可能为空
letpossibleNumber="123"
- letconvertedNumber=possibleNumber.toInt()
- //convertedNumberisinferredtobeoftype"Int?",or"optionalInt"
if语句以及强制解析
用if语句判断一个Optional是否包含值,当确定Optional是有值的时候,在后面加叹号 ! 来获取这个值,表示我切确的知道这是有值的,被成为强制解析,但是获取一个不存在的Optional的值的话会导致运行时错误,请一定确认Optional包含一个非nil的值才使用 !
ifconvertedNumber{
- println("(possibleNumber)hasanintegervalueof(convertedNumber!)")
- }else{
- println("(possibleNumber)couldnotbeconvertedtoaninteger")
- //prints"123hasanintegervalueof123"
可选绑定
使用可选绑定来判断Optional是否包含值,如果包含则把值赋给一个临时变量或常量,可选绑定用在if和while之间来对可选的值进行判断并把值赋给常量或变量
ifletconstantName=someOptional{
- statements
- }
以下可理解为:如果possibleNumber.toInt 返回的可选值Int包含一个值,则新建一个actualNumber的常量并赋值给他,actualNumber的值可在if语句中使用,并且已经初始化,不需要用 ! 来取值
ifletactualNumber=possibleNumber.toInt(){
- println("(possibleNumber)hasanintegervalueof(actualNumber)")
- //prints"123hasanintegervalueof123"
nil
给变量赋值为nil,表示没有值,如果声明了一个常量或变量没有赋值,则会自动被设置为nil
serverResponseCode:Int?=404
- //serverResponseCodecontainsanactualIntvalueof404
- serverResponseCode=nil
- //serverResponseCodenowcontainsnovalue
- varsurveyAnswer:String?
- //surveyAnswerisautomaticallysettonil
Swift中的nil和OC中的nil并不一样,在OC中,nil是一个指向空对象的指针,在Swift中,nil是一个确定的值,表示值的缺失,任何类型都可以赋值为nil
Implicitly Unwrapped Optionals 隐式解析可选
Optional表示常量或变量可以没有值,通过if来判断是否有值,如果通过可选绑定来解析值,但在第一次被赋值之后,就可以确定一个可选值总会有值的了,这样的话每次再去判断和解析Optional值就会变得低效了
这样类型的可选定义为隐式解析可选,把 ? 改成 ! 来声明一个隐式解析可选,比如String!, 一个隐式解析可选其实就是一个普通的可选,但可以当做非可选来用,并不需要每次都使用解析来获取可选值
possibleString:String?="Anoptionalstring."
- println(possibleString!)
- //prints"Anoptionalstring."
- assumedString:String!="Animplicitlyunwrappedoptionalstring."
- println(assumedString)
- //prints"Animplicitlyunwrappedoptionalstring."
11.Assertions 断言
断言在运行时判断一个条件是否为true,使用断言来保证在运行其他代码的时候,某些重要条件已经得到满足,否则代码终止 使用全局函数assert函数来写一个断言,给assert函数传入一个结果为true或false的表达式以及一条信息,当表达式为false的时候这条信息显示出来
letage=-3
- assert(age>=0,"Aperson'sagecannotbelessthanzero")
- //thiscausestheassertiontotrigger,becauseageisnot>=0
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|