常用数据类型
我们定义一个Int类型的age变量,查看Int的定义,发现在Swift中,Int竟然是Struct类型。
和Kotlin类似,在Kotlin中一切都是对象。
而Swift中,没有基本类型,常用Int、String 等都是通过Struct来定义的。
这样的好处是,我们可以直接在Int类型上进行扩展,如,Xcode中我们输入一个数字,默认会提示有很多属性和方法:
当然,由于Int是Struct类型,我们可以自定义扩展,为其添加实例属性或方法:
extension Int {
//获得该整数的字符串
var toString : String{
return String(self)
}
func add(_ num:Int)->Int{
return self + num
}
}
print(100.toString) //100
print(100.add(100)) //200
值类型与引用类型
Swift supports two kinds of types: value types and reference types. Structs and enums are value types, while classes and functions are reference types.
Swift 中支持两种类型: 值类型和引用类型( value types and reference types)。
值类型
即: 每个实例都拥有其数据的一份副本。
值类型的赋值相当于Javascript中的深拷贝(Deep Copy)。
每个变量都是独立的,不必担心另一个变量会改变它。如下图:
struct Color {
var name:String = "black"
}
var color = Color()
var anthorColor = color
anthorColor.name = "blue"
print(color.name) // black
print(anthorColor.name) //blue
引用类型
即:所有实例共享一个数据副本。
修改其中一个实例的属性,会同步修改其源数据的属性。
因为所有实例的引用指向的内存空间是一样的。如下图:
// 定义一个油漆桶类,颜色是black
class Bucket {
var color:String="black"
}
var bucket = Bucket()
// 引用传值
var azurePaint = bucket
// 改变属性值为蓝色
azurePaint.color = "blue"
// 最终,油漆桶的颜色变为: blue
print(bucket.color)
常用类型举例
以下列举常量数据类型的声明和简单使用,具体的后续还会详细介绍:
// 整型
// 有符号整形 Int,Int8,Int16,Int32,Int16
// 无符号整形: UInt,UInt8,UInt16,UInt32,UInt16
// 一般使用Int类型即可
// 在32位平台上, Int 的长度和 Int32 相同。
// 在64位平台上, Int 的长度和 Int64 相同。
var intNum = 100
// 浮点数
// 浮点数是有小数的数字,比如 3.14159 , 0.1 , 和 -273.15 。
// Double代表 64 位的浮点数。
// Float 代表 32 位的浮点数。
var dnum: Double = 12.5
var fnum: Float = 12.5
// 字符串类型,Swift 类型推断为String类型
let someString = "Some string literal value"
// 显示指定String类型
let anotherString = "Another string literal value"
// 布尔值Bool
// Swift为布尔量 Bool 提供了两个常量值, true 和 false 。
let orangesAreOrange:Bool = true
let turnipsAreDelicious:Bool = false
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
// 输出:Eww, turnips are horrible.
// 和JavaScript语言不同,Swift 的类型安全机制会阻止你用一个非布尔量的值替换掉 Bool。
/*
let i = 1
// 编译期即会报错
if i {
}
*/
// 元组Tuple
// 元组把多个值合并成单一的复合型的值。元组内的值可以是任何类型,而且可以不必是同一类型。
let http404Error = (404, "Not Found")
print("the status code is \(http404Error.0)") //the status code is 404
print("the reason is \(http404Error.1)") //the reason is Not Found
let (statusCode, statusMessage) = http404Error
print("ths status code is \(statusCode)") //ths status code is 404
let http200Status = (statusCode: 200, description:"OK")
print("The status code is \(http200Status.statusCode)") //The status code is 200
// 枚举 enum
// 可以用 enum关键字来定义一个枚举,然后将其所有的定义内容放在一个大括号( {})中:
// Swift 中的枚举更加灵活,并且不需给枚举中的每一个成员都提供值。
enum CompassPoint {
case north
case south
case east
case west
}
var point = CompassPoint.east
// 当point 被赋值为CompassPoint.east,其类型可以被推断为:CompassPoint
print(type(of: point))
//当point的类型被推断为CompassPoint后,就可以使用一个缩写语法(.)将其设置为另一个CompassPoint的值
point = .east
switch point
{
case .north:
print("point is north")
case .south:
print("point is south")
case .east:
print("point is east")
case .west:
print("point is west")
}
// 输出:point is east