前言说明
1.Swift是一种类型安全语言,你可以清楚的知道值的类型,当你想传入一个
Int
类型的数据,类型安全会阻止你不小心传入String
或者其它类型
2.Swift包含C和Objective-C上所有的基础数据类型,同时还提供Array
、Set
、Dictionary
三个集合数据类型。
3.Swift新增高阶数据类型,比如元组Tuple
,用于创建或者传递一组数据,比如它可以作为函数返回值来返回多个值;Swift增加可选类型(Optional
)类型,用于处理值缺失的情况,它类似于nil
,但它可以用于任何类型,同时比nil
指针更加安全。
一、常量和变量
1.声明变量和常量
let constantValue = 233
var variableValue = 0
var xx = 1, oo = 2
let pyl = 233, uzi = 100
1.用
let
来声明常量,且声明之后,值不可改变
2.用var
来声明变量,一定要设置初始化值,否则会报Type annotation missing in pattern
和Class 'ViewController' has no initializers
错误。变量声明之后,值可以改变。
3.我们可以使用var
或let
来同时声明多个变量或常量,中间要用逗号隔开;
2.类型标注,给常量或变量显式地指定数据类型
Swift可以根据你声明的变量或常量来隐式地推断数据类型,当然,你也可以显示地给数据进行类型标注,指定数据类型,如下:
var myFirstValue:String = "This is my first string value."
let mySecondVlue:Int = 101
我们可以在变量或常量名称后面加载:TypeName
来给数据显式指定数据类型,比如,给myFirstValue
指定数据类型为String
类型
3.常量和变量的命名
你可以使用你喜欢的任何字符(包括Unicode
字符)来作为变量名,不过不能以数字开头
,也不能使用数学符号
、保留的或者非法的Unicode字符码位
、连线/制表符
。
注意↓↓↓
一旦为常量或变量指定确定的类型,就不能使用相同的名字再次进行声明,不能改变其存储值的类型,同时也不能将常量与变量进行相互转换。
4.常量和变量的输出
你可以使用NSLog(format: String, args: CVarArg...)
,这样和Objective-C
上面的类似。接下来说的是print( )
输出语句。
我们可以直接使用print(items: Any..., separator: String, terminator: String)
或print(items: Any...)
来输出一个或者多个变量或者常量的值,如
print(constantValue) //输出的结果是常量constantValue的值
print(constantValue,variableValue)//输出的结果是常量constantValue的值
在print(items: Any..., separator: String, terminator: String)
中,当输出多个变量/常量时,我们可以给separator
设置值来在每两个变量/常量之间添加一些信息,同时也可以给terminator
设置值来在输出末尾显示一些其它信息,当然你也可以传递空字符" "
给它们,如下,
print(constantValue, variableValue,separator: "\n", terminator: "\nOther messages.")
输出结果为:
233
0
Other messages.
也可以通过print("string\(常量或变量名称)")
的方式来输出,如
print("I have\(constantValue)apples") //输出结果:I have 233 apple
二、Swift标记和注释
常用标记:
// TODO:这是一个标记说明
// MARK: 这也是一个标记说明
// FIXME:这是一句提醒说明
效果如下,
常用注释:
//这是一句单行注释
/*这是多行注释*/
/*
*这样可以写很多注释
*/
三、Swift数据类型和数据范围
1.整数类型
Swift
中整数类型可以是有符号(Int)
的(正数
、负数
、零
)或者无符号(UInt)
的(正数
、零
)
我们可以通过.min
和.max
来获取整数数据表示范围的最小值和最大值
let minValue = Int64.min
let maxValue = Int64.max
print(minValue,maxValue, separator: "\n", terminator: "\nInt64的数据类型范围")
输出结果
-9223372036854775808
9223372036854775807
Int64的数据类型范围
也就是说Int64
的数据类型范围为-9223372036854775808 ~ 9223372036854775807
。
在Swift
中,Int
为特殊的整数类型,长度与当前平台的原生字长度相同。
在
32位平台
上,Int
与Int32
长度相同.
在64位平台
上,Int
与Int64
的长度相同.
UInt
和Int
一样,只是UInt
是无符号的。
2.浮点类型
浮点数据的表示范围比整型数据的范围更大,它可以表示比整型数据更大或者更小的数据。在Swift
中提供了Float
和Double
两种浮点数据类型。
其中,Float
表示32位浮点数据
,Double
表示64位浮点数据
,在数据处理中,如果两个类型都匹配,优先选择Double
。
四、类型推断、类型安全以及类型检查
Swift
是类型安全(type safe)
的语言,它可以清楚的让你知道所处理数据值的类型,当你需要传入一个Int
类型的数据时,在编译的时候,Swift
类型安全(type safe)
会进行类型检查(type checks)
,把不符合的类型标记为错误,所以你绝对不会错误的传进去一个String
类型的数据。
当你在声明一个变量或者常量式,只给他们一个字面量(Literals)而没有显式指定数据类型时,类型推断(type inference)
会根据情况来指定合适的数据类型,如下
let xxoo = 12 //xxoo会被指定为Int类型
let py = 12 + 3.1412926//py会被指定为Double
注意,当推断浮点数据时,总是优先选择Double
,而不是Float
.
五、数值型字面量
整数字面量可以被写作:
1.十进制数据,没有前缀;
2.二进制数据,前缀0b
3.八进制数据,前缀0o
4.十六进制数据,前缀0x
浮点字面量可以是十进制或者是十六进制,小数点两边必须至少有一个十进制(或十六进制)数字。
十进制浮点数也可以有一个可选的指数(exponent
),用大小或小写的e
来表示。
如果一个十进制浮点数的指数为exponent
,则该浮点数可以表示为基数*10^exponent
,如下
1.25e2 = 1.25*10^2
1.25e-2 = 1.25*10^-2
十六进制浮点数必须有一个指数,用大写或小写的p
来表示。
如果一个十六进制浮点数的指数为exponent
,则该十六进制浮点数可以表示为基数*2^exponent
,如下
0xFp3 = 15 * 2^3
0xFp-3 = 15 * 2^-3
下面插入一下16进制小数转化为10进制小数的步骤,如0xC.35p0 ↓↓↓↓↓↓
在十进制中,小数点后第一位为
十分位
,第二位为百分位
,以此类推......
在十六进制中,小数点后第一位为16分位
,第二位为256
分位,以此类推......
所以十六进制的小数0xC.35p0
转化为十进制小数位(12 + 3/16 + 5/256)*2^0
,结果为12.2070312*2^0 = 12.2070312
数值类字面量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,不会影
响字面量:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
五、类型别名
我们可以通过类型别名(type aliases)
来给现有类型起一个别名。
typealias Hahahahaha = Int64
var haha = Hahahahaha.min
var ahah = Hahahahaha.max
我们通过关键字typealias
给Int64
类型起一个别名为Hahahahaha
,Hahahahaha
具有Int64
类型所有的功能。
六、元组
元组(tuple)
是一个许多不同类型数据值的集合(这是个人理解),它不像数组Array
一样要求里面的元素必须是同一类型。如下,
var httpReturnCode = (200,"Success",[1,12,44])
我们定义了一个元组类型的数据,名称为httpReturnCode
,值为(200,"Success",[1,12,44])
我们可以通过内容分解来获取和使用元组中的数据,如下
let httpReturnCodeTuple = (200,"Success")
let (code,message) = httpReturnCodeTuple
print("Login return code is \(code),message:\(message)")
当我们只想使用元组中的一部分数据时,可以通过下面的方式,即用( _ )
来代替其它不略和不需要的部分。
let (loginCode,_) = httpReturnCodeTuple
print("Login code is\(loginCode).")
我们还可以通过下面的方式,来声明、获取和使用一个元组,即在声明的时候给每个元素单独命名,然后通过下标来访问
let httpReturnCodeTuple = (httpCode:200,httpMessage:"Success")
print("Login return code is \(httpReturnCodeTuple.httpCode),message:\(httpReturnCodeTuple.httpMessage)")
关于元组的比较
Bool类型的值不能比较,所以当元组中有Bool值时,不能用于两个元组的比较。元组比较会按照从左到右、逐值比较的方式,知道发现有两个值不等时停止。如果所有值相等,那么这两个元组就是相等的。请看下面的例子,
let tuple01 = (1,"swift")
let tuple02 = (3,"ObjC")
let tuple03 = (3,"swift")
if tuple01 >= tuple02
{
print("True")
}
else
{
print("False")
}
if tuple02 < tuple03
{
print("True")
}
else
{
print("False")
}
输出的结果是:False
和True
因为tuple01
和tuple02
比较时,1 < 3
,此时停止比较,tuple01 < tuple02
.但是,当tuple02
和tuple03
比较时,3 = 3
,接下来就开始比较ObjC
和swift
两个字符串的大小,ObjC < swift
,所以tuple02 < tuple03
.
接下来穿插一下Swift中两个字符串大小的比较规则,
Swift
中字符串的大小比较是逐位比较Unicode编码大小
:
1、如果第一位不同,则哪个第一位的值大就是哪个大
2、如果第一位相同,则比较第二位,规则一样
3、以此类推
七、可选类型
可选类型(optionals)
用于处理值可能缺失的情况,它包含的意思如下,
有值,等于未知数x
或
没有值
注意
C
和Objective-C
中并没有可选类型这个概念。最接近的是Objective-C
中的一个特性,一个方法要不返回一 个对象要不返回nil
,nil
表示“缺少一个合法的对象”
。然而,这只对对象起作用——对于结构体,基本的C 类型
或者枚举类型
不起作用。对于这些类型,Objective-C
方法一般会返回一个特殊值(比如NSNotFound
)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift
的可选类型可以让 你暗示任意类型的值缺失,并不需要一个特殊值。
在Swift
中,我们可以通过Int
的一种构造器将String
类型转化为Int
类型,比如我们可以将String类型的“110”转化为Int类型的“110”,如下,
let gouString:String = "110"
let gouInt = Int(gouString)
print(type(of: gouInt))
控制台输出为:Optional<Int>
也就是说gouInt
常量会被推断为Optional Int
类型,而不是Int
类型。因为gouString
通过构造器转化为Int
值时,可能成功,有值;也可能失败,没有值。
可选类型(optionals)
和nil
在Swift
中,nil
可以给可选变量(划重点,注意,是可选)
赋值,表示它没有值。当声明一个可选的变量或常量而没有赋值时,它们会被自动设置为nil
,如下,
//xxx会被赋值为nil
var xxx:String?
print(xxx)
但是,有一点需要注意,Swift
的nil
和 Objective-C
中的 nil
并不一样。在Objective-C
中, nil
是一个指向不存在对象的指 针。在 Swift
中, nil
不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设 置为 nil
,不只是对象类型。