Swift有很多高級(jí)特性,個(gè)人感覺Swift在語(yǔ)法跟數(shù)據(jù)結(jié)構(gòu)上比Java要高級(jí)好多.
聲明類
import Foundation
//使用class和類名創(chuàng)建一個(gè)類.類中屬性的聲明和常量,變量聲明一樣,唯一的區(qū)別就是它們的上下文是類.同樣,方法同函數(shù)聲明也一樣.
class Shape {
var numberOfSides = 0
let maxNumber = 0
func simpleDescripe() -> String {
return "A shape with \(numberOfSides) sides"
}
func calMaxNumber(number:Int) -> String {
return "The max number is \(number)"
}
}
實(shí)例化類并訪問屬性調(diào)用方法
//要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,在類名后面加上括號(hào),用點(diǎn)語(yǔ)法訪問屬性和方法
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescripe()
創(chuàng)建構(gòu)造器(構(gòu)造方法)
//上面的類Shape少了一些重要的東西:一個(gè)構(gòu)造函數(shù)來(lái)初始化類實(shí)例,用init來(lái)創(chuàng)建一個(gè)構(gòu)造器
class NamedShape {
var numberOfSides: Int = 0
var name: String
init(name: String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides"
}
}
//注意self是用來(lái)區(qū)別實(shí)例變量的.當(dāng)創(chuàng)建實(shí)例的時(shí)候,像給函數(shù)傳入?yún)?shù)一樣一樣給類的構(gòu)造函數(shù)傳入函數(shù),每個(gè)屬性都需要被賦值,不然會(huì)報(bào)錯(cuò)--無(wú)論是通過(guò)聲明(像numberOfSides)還是通過(guò)構(gòu)造函數(shù)(就像name)
//如果需要在刪除對(duì)象之前進(jìn)行清理操作,使用deinit創(chuàng)建一個(gè)析構(gòu)函數(shù)
繼承父類重寫方法
//子類的定義方法是在他們的類名后面加上父類的名字,用冒號(hào)分隔.創(chuàng)建類的時(shí)候并不需要一個(gè)標(biāo)準(zhǔn)的根類,所以可以忽略父類.
//子類如果要重寫父類的方法,需要用override標(biāo)記.如果沒用標(biāo)記就重寫父類方法編譯器會(huì)報(bào)錯(cuò).編譯器同樣會(huì)檢測(cè)override標(biāo)記的方法是否確實(shí)在父類中.
class Sequare: NamedShape {
var sideLength: Double
init (sideLength: Double, name:String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length is \(sideLength)"
}
}
let sequare = Sequare(sideLength: 5.0, name: "xiaoming")
sequare.area()
sequare.simpleDescription()
//練習(xí): 創(chuàng)建NamedShape的另一個(gè)子類Circle,構(gòu)造器接收兩個(gè)參數(shù),一個(gè)是半徑一個(gè)是名稱,在子類Circle中實(shí)現(xiàn)area()和simpleDescription()方法。
class Circle:NamedShape {
var radius:Double
init(radius: Double, name: String) {
self.radius = radius
super.init(name: name)
}
func area() -> Double {
return radius * radius * 3.14
}
override func simpleDescription() -> String {
return "A circle with radius of length is \(radius)"
}
}
屬性的setter和getter
//除了存儲(chǔ)簡(jiǎn)單的屬性之外,屬性還可以有g(shù)etter方法和setter方法
//在swift中使用get/set 主要是用來(lái)間接獲取/改變其他屬性的值。在swift中這類屬性被稱之為“計(jì)算屬性” ,不要拿其他面向?qū)ο笳Z(yǔ)言跟Swift作對(duì)比(尤其是Java,OC,Java中的setter跟getter方法就是操作本屬性)
class EquilateralTriangle: NamedShape {
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
}
// set(value) {
// sideLength = value / 3.0
// }
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)
//在perimeter的setter中,新值的名字是newValue.可以在set之后顯式設(shè)置一個(gè)名字.
//注意:EquilateralTriangle類的構(gòu)造器執(zhí)行了三步:
//1.設(shè)置子類聲明的屬性值
//2.調(diào)用子類構(gòu)造器
//3.改變父類定義的屬性值.其他的工作比如調(diào)用方法,getters和setters也可以在這個(gè)階段完成.
屬性監(jiān)視willSet跟didSet
//如果不需要計(jì)算屬性,但是仍然需要在設(shè)置一個(gè)新值之前或者之后運(yùn)行代碼,使用willSet或者didSet.willSet跟didSet用來(lái)監(jiān)視除初始化之外的屬性值的變化.當(dāng)這個(gè)值變化之前做點(diǎn)什么別的事,變化之后做點(diǎn)什么別的事.
//比如,下面的了確保三角形的變成總是和正方形的變成相同
class TriangleAndSquare {
var triangle: EquilateralTriangle {
willSet {
sequare.sideLength = newValue.sideLength
}
// willSet(value) {
// print("willSet")
// sequare.sideLength = value.sideLength
// }
}
var sequare: Sequare {
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size: Double, name: String) {
sequare = Sequare(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "Another test sequare")
print(triangleAndSquare.sequare.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.sequare = Sequare(sideLength: 50, name: "larger sequare")//只有這句才能調(diào)用willSet,初始化不調(diào)用
print(triangleAndSquare.triangle.sideLength)
處理可選值
//處理變量的可選值時(shí),可以在操作(比如屬性,方法,子腳本)之前加?.如果?之前的值是nil,則?后面的內(nèi)容會(huì)被忽略,并且整個(gè)表達(dá)式返回nil.否則?之后的內(nèi)容都會(huì)被執(zhí)行.這兩種情況下整個(gè)表達(dá)式也是一個(gè)可選值
let optionalSquare: Sequare? = Sequare(sideLength: 20, name: "optional")
let sideLength = optionalSquare?.sideLength
print(sideLength!)