对象和类:
类:使用class来创建一个类,类的名称附加在class之后,类中的属性声明和普通的变量和常量的声明是一样的,除非是在类的上下文中,方法和函数也是这么写。
class shape {
var simpleOfNumber = 7
func simpleDesciription() -> string {
return “the simple number is \ (simpleOfNumber)”
}
}
var myShape = shape()
shape. simpleOfNumber = 34
print(“myShape. simpleDesciription()”)
class NameShape {
var numberOfSides: Int = 0
var name: String
init(name: String ) {
self . name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
除了保存简单的属性,属性还有一个getter 和一个setter
class EquilateralTriangle: NameShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String ) {
self . sideLength = sideLength
super. init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)"
}
}
var triangle = EquilateralTriangle(sideLength: 3.1 , name: "a triangle" )
triangle. perimeter
triangle. perimeter = 9.9
triangle. sideLength
类中的方法和函数有一个重要的区别,函数的参数名只在函数内部使用,但是方法的参数名在你调用方法的时候也会被使用(除了第一个参数),默认情况下,方法使用的参数和你调用方法时传递的参数同名,但是,你可以为方法的参数指定第二个名字,以供在方法内部使用。
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes times: Int) -> String {
count += amount * times
return "\(count)"
}
}
var counter = Counter()
print(counter. incrementBy(2 , numberOfTimes: 7 ))
枚举、结构体
枚举与结构 使用enum来创建一个枚举,和类以及其他命名类型一样,枚举可以包含方法
enum Rank : Int {
case Ace = 1
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace :
return "ace"
case .Jack :
return "jack"
case .Queen :
return "queen"
case .King :
return "king"
default :
return String(self.rawValue)
}
}
}
let ace = Rank.Ace
let aceRawValue = ace.rawValue
// 在上边的示例中,枚举的原始值(raw value)类型是int,所以你只需要指定第一个原始值。其后的原始值都是按照顺序赋值的,你还可以使用字符串或者浮点数作为枚举的原始值。
当枚举提供的原始值没有实际意义的时候,可以不提供。
// 不提供原始值的枚举
enum Suit {
case Spades, Hearts, Diamonds, Clubs
func simpleDescription() -> String {
switch self {
case .Spades :
return "spades"
case .Hearts :
return "hearts"
case .Diamonds :
return "diamonds"
case .Clubs :
return "clubs"
}
}
func anotherSimpleDescription() -> String {
switch self {
case .Spades, .Clubs :
return "black"
case .Hearts, .Diamonds :
return "red"
}
}
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()
let anotherHearts = Suit.Hearts
anotherHearts.anotherSimpleDescription()
// 上面引用hearts成员的两种方法:当给hearts常量赋值时,枚举成员suit.hearts通过全名引用,因为常量没有显示声明类型。在switch 中,枚举通过.hearts引用,因为self的值是已知的。可以在值类型已知的情况下使用这种缩写。
结构体 通过struct创建结构体,结构体和类有很多相同的行为,包括方法和构造器。一大重要的区别是,结构体在代码中是通过拷贝来传递(值传递),而类则是引用传递。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
enum ServerResponse {
case Result(String , String )
case Error (String )
}
let success = ServerResponse.Result("6:00 am" , "8.09 pm" )
let failure = ServerResponse.Error("Out of cheese." )
switch success {
case let .Result(sunrise, sunset):
let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)"
case let .Error(error):
let serverResponse = "Failure....\(error)"
}