加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 基础部分(一)

发布时间:2020-12-14 01:34:18 所属栏目:百科 来源:网络整理
导读:基础部分 Swift的类型是在C和Objective-C的基础上改进,Int是整型,Double和Float是浮点型,Bool是布尔型,String是字符串,Array和Dictionary是集合,还有一些其他语言没有的比如元组,元组可以创建或传递一组数据,比如作为函数的返回值,可以用元组来返回

基础部分

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定义,常量的值一旦设定不能再改变,而变量可以多次赋值
[objc] view plain copy
  1. letmaximumNumberOfLoginAttempts=10
  2. varcurrentLoginAttempt=0
以上例子中,看定义的名称大约也可以猜出来是什么意思了,定义一个不可变的常量,表示最大的登录尝试次数,定义一个变量,表示当前已经尝试过的登录次数
也可以在一行中定义多个变量或常量
    varx=0.0,y=0.0,z=0.0

2.类型标注

可以在定义常量或变量的时候提供一个类型标注,指明所定义的值是什么类型的,在变量或常量后面添加一个冒号,其次是类型名称,以下是定义了一个变量,类型是字符串String类型
    varwelcomeMessage:String
然后这个字符串变量又可以随意赋其他的值了
    welcomeMessage="Hello"
一般来说添加类型注释是比较少用的,如果你在定义的时候提供了一个初始值,那编译器就会识别定义的变量或常量的类型,而不需要再指定
变量名或常量名可以使用unicode字符
    letπ=3.14159
  1. let你好="你好世界"

虽然说可以使用unicode来定义,但也要遵守一些规则,不能使用数学运算符,箭头,代码点还有一些什么畸形的符号什么的(保留的或非法的Unicode码),也不能以数字开头

一旦确定了一个常量或变量的类型,就不能再用相同的名字再定义了,或存储不同类型的值,也不能把变量改为常量,也不能把常量改为变量
变量可以再赋一个相同类型的值,而常量一旦设定就不能再改变了
    varfriendlyWelcome="Hello!"
  1. friendlyWelcome="Bonjour!"
  2. //friendlyWelcomeisnow"Bonjour!"
  3. letlanguageName="Swift"
  4. languageName="Swift++"
  5. //thisisacompile-timeerror-languageNamecannotbechanged


使用println方法打印,就像Objective-C里的NSLog,使用反斜线和小括号显示变量

    println("Thisisastring")
  1. println("ThecurrentvalueoffriendlyWelcomeis(friendlyWelcome)")


注释,跟其他类型语言的注释一样,自己体会

    //thisisacomment
  1. /*thisisalsoacomment,
  2. butwrittenovermultiplelines*/
  3. /*thisisthestartofthefirstmultilinecomment
  4. /*thisisthesecond,nestedmultilinecomment*/
  5. thisistheendofthefirstmultilinecomment*/


分号,分号在这里已经不是必须的了,不过也要分清场合,如果你要在一行写多个语句,分号就不能省了

    letcat="cat";println(cat)

3.整数

整数就是没有小数部分的数字,可以使有符号(正、负、零)和无符号(正、零)
Swift提供了8、16、32和64位的有符号和无符号整数类型,分别命名为Uint8,UInt16,UInt32,UInt64

整数范围

访问不同类型的min和max属性来获取相应类型的最小和最大值
    letminValue=UInt8.min//minValueisequalto0,andisoftypeUInt8
  1. letmaxValue=UInt8.max//maxValueisequalto255,andisoftypeUInt8

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
  1. //meaningOfLifeisinferredtobeoftypeInt
如果没有给浮点数标明类型,Swift会推出类型是Double,当推测浮点数时,优选选择Double而不是Float
    letpi=3.14159
  1. //piisinferredtobeoftypeDouble
  2. letanotherPi=3+0.14159
  3. //anotherPiisalsoinferredtobeoftypeDouble

5.进制表示法

以下是用十进制、二进制、八进制和十六进制来表示17
    letdecimalInteger=17
  1. letbinaryInteger=0b10001//17inbinarynotation
  2. letoctalInteger=0o21//17inoctalnotation
  3. lethexadecimalInteger=0x11//17inhexadecimalnotation

6.Numberic Type Conversion 数值类型转换

Integer Conversion整数的转换

每种数值类型能表示的数字范围是不一样的,Int8能表示的范围是-128到127之间,UInt8能表示的范围为0到255之间,如果赋的值与数值类型不一致将会在编译的时候报错

    letcannotBeNegative:UInt8=-1
  1. //UInt8cannotstorenegativenumbers,andsothiswillreportanerror
  2. lettooBig:Int8=Int8.max+1
  3. //Int8cannotstoreanumberlargerthanitsmaximumvalue,
  4. //andsothiswillalsoreportanerror
因为每个数值类型都可以存储不同范围的值,所以必须在转换的时候指定一个数值类型,以防止转换错误

以下例子中,2000是UInt16类型,1是UInt8类型,如果想要两数相加操作,需要把把他们转换为同一种类型
    twoThousand:UInt16=2_000
  1. letone:UInt8=1
  2. lettwoThousandAndOne=twoThousand+UInt16(one)

Integer and Floating-Point Conversion 整数和浮点数之间的转换
    letthree=3
  1. letpointOneFourOneFiveNine=0.14159
  2. letpi=Double(three)+pointOneFourOneFiveNine
  3. //piequals3.14159,andisinferredtobeoftypeDouble
在这里,3由Int型转换为Double型,这样两种类型相同才能相加,否则编译不通过
反过来,浮点数转换为整数会丢失精度
    letintegerPi=Int(pi)
  1. //integerPiequals3,andisinferredtobeoftypeInt

7.Type Aliased 类型别名

类似linux中的alias,可以给类型取别名,给类型取别名后就可以直接使用它的属性

    typealiasAudioSample=UInt16
  1. varmaxAmplitudeFound=AudioSample.min
  2. //maxAmplitudeFoundisnow0

8.Booleans 布尔类型

    letorangesAreOrange=true
  1. letturnipsAreDelicious=false
  2. ifturnipsAreDelicious{
  3. println("Mmm,tastyturnips!")
  4. }else{
  5. println("Eww,turnipsarehorrible.")
  6. }
  7. //prints"Eww,turnipsarehorrible."
  8. leti=1
  9. ifi{
  10. //thisexamplewillnotcompile,andwillreportanerror
  11. }
  12. ifi==1{
  13. //thisexamplewillcompilesuccessfully
  14. }

9.Tuples 元组

元组相当于一个key对应多个value,把多个值组合成一个复合值,value的类型可以是不同的
    lethttp404Error=(404,"NotFound")
  1. //http404Errorisoftype(Int,String),andequals(404,"NotFound")
  2. let(statusCode,statusMessage)=http404Error
  3. println("Thestatuscodeis(statusCode)")
  4. //prints"Thestatuscodeis404"
  5. println("Thestatusmessageis(statusMessage)")
  6. //prints"ThestatusmessageisNotFound"
如果元组内有值没有用到,用下划线 _ 来省略
    let(justTheStatusCode,_)=http404Error
  1. println("Thestatuscodeis(justTheStatusCode)")
  2. //prints"Thestatuscodeis404"
也可以使用下标代替元组的值,下标从0开始
    println("Thestatuscodeis(http404Error.0)")
  1. //prints"Thestatuscodeis404"
  2. println("Thestatusmessageis(http404Error.1)")
  3. //prints"ThestatusmessageisNotFound"
在定义元组的同时就把名字给取好了,取值的时候就是元组加属性了
    lethttp200Status=(statusCode:200,description:"OK")
  1. println("Thestatuscodeis(http200Status.statusCode)")
  2. //prints"Thestatuscodeis200"
  3. println("Thestatusmessageis(http200Status.description)")
  4. //prints"ThestatusmessageisOK"
作为函数返回值,元组非常有用,相比只能返回一个类型的值比起来,元组能让函数返回值更丰富

10.Optional 可选

使用Optional来处理值可能缺失的情况,一个方法要么返回一个对象,要么返回nil,但这只对对象起作用,对结构体、基本C类型或者枚举类型不起作用,OC方法一般会返回一个特殊值表示值的缺失,然而Swift的Optional可让你暗示任意值的缺失,而不需要特殊的值
例子:String有个toInt的方法将String类型转换为Int类型,但是toInt方法可能会失败,所以返回的是一个Optional的Int,而不是一个Int,Optional的Int写作 Int? 问号表示包含的值是可选的,可能有值也可能为空
    letpossibleNumber="123"
  1. letconvertedNumber=possibleNumber.toInt()
  2. //convertedNumberisinferredtobeoftype"Int?",or"optionalInt"

if语句以及强制解析
用if语句判断一个Optional是否包含值,当确定Optional是有值的时候,在后面加叹号 ! 来获取这个值,表示我切确的知道这是有值的,被成为强制解析,但是获取一个不存在的Optional的值的话会导致运行时错误,请一定确认Optional包含一个非nil的值才使用 !
    ifconvertedNumber{
  1. println("(possibleNumber)hasanintegervalueof(convertedNumber!)")
  2. }else{
  3. println("(possibleNumber)couldnotbeconvertedtoaninteger")
  4. //prints"123hasanintegervalueof123"

可选绑定
使用可选绑定来判断Optional是否包含值,如果包含则把值赋给一个临时变量或常量,可选绑定用在if和while之间来对可选的值进行判断并把值赋给常量或变量
    ifletconstantName=someOptional{
  1. statements
  2. }
以下可理解为:如果possibleNumber.toInt 返回的可选值Int包含一个值,则新建一个actualNumber的常量并赋值给他,actualNumber的值可在if语句中使用,并且已经初始化,不需要用 ! 来取值
    ifletactualNumber=possibleNumber.toInt(){
  1. println("(possibleNumber)hasanintegervalueof(actualNumber)")
  2. //prints"123hasanintegervalueof123"

nil
给变量赋值为nil,表示没有值,如果声明了一个常量或变量没有赋值,则会自动被设置为nil
    serverResponseCode:Int?=404
  1. //serverResponseCodecontainsanactualIntvalueof404
  2. serverResponseCode=nil
  3. //serverResponseCodenowcontainsnovalue
  4. varsurveyAnswer:String?
  5. //surveyAnswerisautomaticallysettonil
Swift中的nil和OC中的nil并不一样,在OC中,nil是一个指向空对象的指针,在Swift中,nil是一个确定的值,表示值的缺失,任何类型都可以赋值为nil

Implicitly Unwrapped Optionals 隐式解析可选
Optional表示常量或变量可以没有值,通过if来判断是否有值,如果通过可选绑定来解析值,但在第一次被赋值之后,就可以确定一个可选值总会有值的了,这样的话每次再去判断和解析Optional值就会变得低效了
这样类型的可选定义为隐式解析可选,把 ? 改成 ! 来声明一个隐式解析可选,比如String!, 一个隐式解析可选其实就是一个普通的可选,但可以当做非可选来用,并不需要每次都使用解析来获取可选值
    possibleString:String?="Anoptionalstring."
  1. println(possibleString!)//requiresanexclamationmarktoaccessitsvalue
  2. //prints"Anoptionalstring."
  3. assumedString:String!="Animplicitlyunwrappedoptionalstring."
  4. println(assumedString)//noexclamationmarkisneededtoaccessitsvalue
  5. //prints"Animplicitlyunwrappedoptionalstring."

11.Assertions 断言

断言在运行时判断一个条件是否为true,使用断言来保证在运行其他代码的时候,某些重要条件已经得到满足,否则代码终止
使用全局函数assert函数来写一个断言,给assert函数传入一个结果为true或false的表达式以及一条信息,当表达式为false的时候这条信息显示出来
    letage=-3
  1. assert(age>=0,"Aperson'sagecannotbelessthanzero")
  2. //thiscausestheassertiontotrigger,becauseageisnot>=0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读