五、类与对象
1.Swift的枚举(enum)类型及遍历
//关键词:enum,枚举的名称应该以一个大写字母开头
enum Orientation
{
case North
case South
case East
case West
}
Orientation.South // 点语法获取枚举成员
enum Fruit
{
//多个枚举成员还可以在同一行定义,它们之间用逗号分割即可
case Apple, Banana, Orange, Peach, Watermelon
}
var myFavorite = Fruit.Apple //变量会推断为枚举类型
myFavorite = .Orange
let somePlanet = Orientation.East
switch somePlanet
{
case .East:
print("Where the sun rises.")
default:
print("Where the sun dosen't rise")
}
enum ASCIICharacter: Character //定义一个枚举,并设置枚举成员的值类型为字符
{
case Tab = "\t" //设置默认值
case LineFeed = "\n"
case CarriageReturn = "\r"
}
ASCIICharacter.Tab
2.给枚举类型添加方法
enum Language : Int
{
case Swift = 2
case ObjectiveC
case Unknow
func description()
{
if self == .Swift
{
print("Coding in swift.")
}
else if self == .ObjectiveC
{
print("Coding in Objective-C.")
}
else if self == .Unknow
{
print("Wondering...")
}
}
}
let swift = Language.Swift //初始化一个枚举常量
swift.description() //调用枚举方法
swift.rawValue //通过枚举成员的原始值属性,可以查看该成员的原始值。原始值:是当第一次定义枚举时,用来预先填充成员的值
Language.ObjectiveC.rawValue//系统会自动为枚举成员分配一个原始值
3.Swift的结构(struct)类型及其下标(subscript)
//struct结构体是构建代码常用的一种通用灵活的构造体,通过为结构体定义属性和方法,可以扩展结构体的功能
//关键词:struct,名称通常使用首字母大写的形式
struct Animal
{
var name: String = "" //定义字符串类型的属性
var age: Int = 0 //定义整型类型的属性
func say() //定义方法
{
print("I am \(name).")
}
}
var animal = Animal(name: "Tiger", age: 2) //实例化一个结构体对象,并设置属性值
animal.say() //调用结构体方法
var animal2 = animal //当将一个结构体对象赋值给另一个变量或常量时,采用的是复制的方式。此时animal和animal2两个变量具有不同的内存地址
animal2.name = "Bird"
print(animal2)
print(animal)
struct MySubscript
{
var num:Int
subscript(n: Int) -> Int //使用subscript关键词,给结构体添加一个下标操作,该下标用来返回当前属性的值得指定倍数。
{
return num * n
}
}
let subscr = MySubscript(num: 5)
subscr[2]
4.类(class)的初始化方法、属性和方法
//关键字:class,其后是类的名称,首字母通常需要大写,类的具体内容在一段大括号之内。
class Person
{
var name: String
var age: Int
//初始化方法
init()
{
self.name = ""
self.age = 0
}
//所有的convenience便利初始化方法,都必须调用同一个类中的初始化方法来完成设置,用来作为补充和提供使用上的方便
convenience init(name: String!,age: Int!)
{
self.init() //便利初始化方法,是不能被自雷重写,或者是在子类中以supper的方式调用的
self.name = name
self.age = age
}
//给类添加方法
func say()
{
print("Hi, I am \(name), and \(age) years old.")
}
}
let person = Person() //创建类的实例
person.name = "Jerry"
person.age = 35
person.say()
let secondPerson = Person(name: "Bill", age: 32)
secondPerson.say()
5.类的引用(reference)特征
//与值类型不同,引用类型在被赋予到一个变量,常量或者被传递到一个函数时,操作的并不是其拷贝,而是已存在的实力本身
class Animals
{
var name: String
var age: Int
init(animalName: String, age: Int)
{
self.name = animalName
self.age = 0
}
func say()
{
print("Hi, I am \(name).")
}
}
let animal3 = Animals(animalName: "Will", age: 20)
let animal4 = animal3
animal4.name = "Tom"
animal3.say()
animal4.say()
6.类和结构体两个类型的比较
//结构体对象之间的值传递,采用的是拷贝的方式,所以两个对象都是相对独立的,一方发生变化,不会对另一方产生影响,即:值类型
//类对象之间的值传递,采用的是引用的方式,即:引用类型
struct Animal3
{
var name: String
var age: Int
}
let tiger = Animal3(name: "Tiger", age: 2)
var lion = tiger
lion.name = "Lion"
print(tiger.name)
print(lion.name)
class Person1
{
var name: String
var age: Int
init()
{
self.name = ""
self.age = 0
}
}
let person3 = Person1()
let person4 = person3
person4.name = "Jerry"
print(person3.name)
print(person4.name)
person4 === person3 //使用全等号,来比较对同一个实例进行引用的两个对象
7.类属性的set和get方法解析
//get和set关键词被称为计算属性。它的目的是在取值和赋值时,执行里面的代码。
class Player
{
var name: String = "Sam"
var level: Int = 3
var score: Double
{
get
{
return Double(level) * 2.0
}
set(newScore)
{
level = Int(newScore) / 2
}
}
}
var player = Player()
player.score
player.score = 4
player.level
8.类属性的willSet和didSet方法解析
//类的属性还拥有willSet和didSet这两个特性,它们被用来监视属性除初始化之外的值变化。
class Player1
{
var name: String = "Sam"
var level: Int = 3
var score: Double = 0.0
{
willSet
{
if level == 3
{
print("Be careful!")
}
else
{
print("Go ahead!")
}
}
didSet
{
print("Do something!")
}
}
}
var player1 = Player1()
player1.score
player1.score = 12
player1