可选值
一个可选值可以有值,也可以没有值,当使用 ->String语句时表示这个函数返回一个字符串,如果想表示这个函数可能返回一个值,也可能不返回任何值,就可以这样写:
func getHaterStatus(weather: String) -> String? {
if weather == "sunny" {
return nil
}else {
return "Hate"
}
}
现在函数接收一个天气参数,可能返回一个字符串,或者一个nil
空合运算符
先判断A是否有值,如果有则使用A的值,否则就使用B的值,这样可以确保始终有值可用
let album = albumReleased(year: 2003)?? "unknown"
print("专辑名是\(album)")
双问号是空合运算符,如果 albumReleased()返回了一个值则把这个值传给了变量album,否则 albumReleased()返回的是nil,就把"unknown"传递过去。
枚举
可以使用枚举来自定义类型
enum WeatherType { //定义一个类型名称WeatherType
case sun, cloud, rain, wind, snow //列举5个可能值
} //大括号结束枚举语法
func getHaterStatus(weather: WeatherType) -> String? {
if weather == WeatherType.sun {
return nil
}else {
return "Hate"
}
}
getHaterStatus(weather: WeatherType.rain)
enum WeatherType {
case sun
case cloud
case rain
case wind
case snow
}
func getHaterStatus(weather: WeatherType) -> String? {
if weather == .sun{
return nil
}else {
return "Hate"
}
}
getHaterStatus(weather: .rain)
在switch/case语句里重写:
func getHaterStatus(weather: WeatherType) -> String? {
switch weather {
case .sun:
return nil
case .cloud, .rain, .wind:
return "dislike"
case .snow:
return "hate"
}
}
带额外值的枚举
可以在枚举值上额外附加值:
enum WeatherType {
case sun
case cloud
case rain
case wind (speed: Int) //增加风力几级的描述
case snow
重写函数
func getHaterStatus(weather: WeatherType) -> String? {
switch weather {
case .sun:
return nil
case .cloud, .rain:
return "dislike"
case .snow:
return "hate"
case .wind(let speed) where speed <10:
return "ohno"
}
}
getHaterStatus(weather: WeatherType.wind(speed:5))
结构
结构是一种复杂的数据类型,是由多个值组成,把多个值打包成一个结构,然后可以把结构当做一个单独的值处理。比如定义一个person结构,在这个结构里有两个属性:clothes和shoes。
struct Person {
var clothes: String
var shoes: String
}
传递一个初始值进去:
let taylor = Person(clothes: "T-shirts," shoes: "sneakers")
let other = Person(clothes: "shortskirts," shoes: "high heels")
创建结构后,访问其属性的方法是:结构名+.+属性名:
print(taylor.clothes)
print(other.shoes)
可以把函数放在结构里,举例:在Person结构里添加一个描述这个人的衣着
struct Person {
var clothes: String
var shoes: String
func describe() {
print("I like wearing \(clothes) with \(shoes)")
}
}
类
类的成员初始化器需要自己写,可以基于某个类写一个新类,在新的类里可以添加任何东西
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
上面的示例定义了一个名为 VideoMode 的类,用来描述视频显示器的某个特定视频模式。这个类包含了四个可变的存储属性。第一个resolution,被初始化为一个新的 Resolution结构体的实例,属性类型被推断为 Resolution。新 VideoMode 实例同时还会初始化其它三个属性,它们分别是初始值为 false 的 interlaced(意为“非隔行视频”),初始值为 0.0 的 frameRate,以及值为可选 String 的 name。因为 name 是一个可选类型,它会被自动赋予一个默认值 nil,意为“没有 name 值”。
属性
结构和类都有自己的变量和常量,这些变量和常量称之为属性,属性允许结构和类自定义自己的之,并且可以拥有自己的方法去处理数据:
struct Person {
var clothes: String
var shoes: String
func describe() {
print("I like wearing \(clothes) with \(shoes)")
}
}
let taylor = Person(clothes: "T-shirts," shoes: "sneakers")
let other = Person(clothes: "shortskirts," shoes: "high heels")
taylor.describe()
other.describe()
属性监视器
Swift可以监视某些属性值,当值变化或即将变化时可以运行一段特定的代码。
共有两种属性监视器:willSet和didSet。willSet句块内,有一个特别的值newValue,包含即将生成的新值,而didSet句块内,用oldValue表示先前值。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("将 totalSteps 的值设置为 \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("增加了 \(totalSteps - oldValue) 步")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// 将 totalSteps 的值设置为 200
// 增加了 200 步
stepCounter.totalSteps = 360
// 将 totalSteps 的值设置为 360
// 增加了 160 步
stepCounter.totalSteps = 896
// 将 totalSteps 的值设置为 896
// 增加了 536 步
}
}
}
存储属性
一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。存储属性可以是*变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字 let 定义)。
下面的例子定义了一个名为 FixedLengthRange 的结构体,该结构体用于描述整数的区间,且这个范围值在被创建后不能被修改。
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// 该区间表示整数 0,1,2
rangeOfThreeItems.firstValue = 6
// 该区间现在表示整数 6,7,8
FixedLengthRange 的实例包含一个名为 firstValue 的变量存储属性和一个名为 length 的常量存储属性。在上面的例子中,length 在创建实例的时候被初始化,且之后无法修改它的值,因为它是一个常量存储属性。
计算属性
struct Person {
var age: Int
var ageInDogYears: Int {
get {
return age * 7
}
}
}
var liu = Person(age: 24)
print(liu.ageInDogYears)
如果只是想读取数据,可以移除get(只读计算属性)
var ageInDogYears: Int {
return age * 7
}