Swift 初始化

2016-08-11  本文已影响17人  点滴86

初始化函数

import UIKit

// 初始化函数
struct Fahrenheit {
    var temperature: Double
    init () {
        temperature = 32.0
    }
}

var f = Fahrenheit()
print("The default temperature is \(f.temperature)° Fahrenheit")

struct Celsius {
    var temperatureInCelsius: Double
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
    
    init(celisus: Double) {
        temperatureInCelsius = celisus
    }
}

let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
print("boilingPointOfWater temperatureInCelsius value is \(boilingPointOfWater.temperatureInCelsius)")

let freezingPointOfWater = Celsius(fromKelvin: 273.15)
print("freezingPointOfWater temperatureInCelsius value is \(freezingPointOfWater.temperatureInCelsius)")

let bodyTemperature = Celsius(celisus: 37.0)
print("bodyTemperature temperatureInCelsius value is \(bodyTemperature.temperatureInCelsius)")

// 可选属性
class SurveyQuestion {
    var text: String
    var response: String?
    init(text: String) {
        self.text = text
    }
    
    func ask() {
        print(text)
    }
}

let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
cheeseQuestion.response = "Yes, I do like cheese."

// 初始化时赋值常量属性
class AnotherSurveyQuestion {
    let text: String
    var response: String?
    init(text: String) {
        self.text = text
    }
    
    func ask() {
        print(text)
    }
}

let anotherCheeseQuestion = AnotherSurveyQuestion(text: "Do you like cheese?")

// 值类型的初始化
struct Size {
    var width = 0.0, height = 0.0
}

struct Point {
    var x = 0.0, y = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()
    init () {
        
    }
    
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2.0)
        let originY = center.y - (size.height / 2.0)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
    
}

let basicRect = Rect()
let originRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
print("basicRect's origin is (\(basicRect.origin.x), \(basicRect.origin.y)) and its size is (\(basicRect.size.width), \(basicRect.size.height))")
print("originRect origin is (\(originRect.origin.x), \(originRect.origin.y)) and its size is (\(originRect.size.width), \(originRect.size.height))")
print("centerRect origin is (\(centerRect.origin.x), \(centerRect.origin.y)) and its size is (\(centerRect.size.width), \(centerRect.size.height))")

console log 如下


初始化函数.png

类的指定初始化函数和便利初始化函数

// 类的指定初始化函数和便利初始化函数
class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    
    convenience init()
    {
        self.init(name: "[Unnamed]")
    }
}

let nameMeat = Food(name: "Bacon")
print("nameMeat's name is \(nameMeat.name)")

let mysteryMeat = Food()
print("mysteryMeat's name is \(mysteryMeat.name)")

class RecipeIngredient: Food {
    var quantity: Int
    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    }
    
    override convenience init(name: String) {
        self.init(name: name, quantity: 1)
    }
}

let oneMysteryItem = RecipeIngredient()
print("oneMysteryItem's name is \(oneMysteryItem.name) and quantity is \(oneMysteryItem.quantity)")

let oneBacon = RecipeIngredient(name: "Bacon")
print("oneBacon's name is \(oneBacon.name) and quantity is \(oneBacon.quantity)")

let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6)
print("sixEggs's name is \(sixEggs.name) and quantity is \(sixEggs.quantity)")

class ShoppingListItem: RecipeIngredient {
    var purchased = false
    var description: String {
        var output = "\(quantity) x \(name)"
        output += purchased ? " ✔" : " ✘"
        return output
    }
}

var breakfastList = [
    ShoppingListItem(),
    ShoppingListItem(name: "Bacon"),
    ShoppingListItem(name: "Eggs", quantity: 6)]
breakfastList[0].name = "Orange juice"
breakfastList[0].purchased = true

for item in breakfastList {
    print(item.description)
}

console log 如下


类的指定初始化函数和便利初始化函数.png

注意: 子类指定初始化函数必须调用直接父类的指定初始化函数,便利初始化函数要最终调用指定初始化函数
RecipeIngredient子类与Food父类 分析


RecipeIngredient子类与Food父类.png
可失败的初始化函数
// 结构体 可失败的初始化函数
struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty {
            return nil
        }
        self.species = species
    }
}

let someCreature = Animal(species: "Giraffe")
if let giraffe = someCreature {
    print("An animal was initialized with a species of \(giraffe.species)")
}

let anonymousCreature = Animal(species: "")
if anonymousCreature == nil {
    print("The anonymous creature could not be initialized")
}

// 枚举 可失败的初始化函数
enum TemperatureUnit {
    case kelvin, celsius, fahrenheit
    init?(symbol: Character) {
        switch symbol {
        case "K":
            self = .kelvin
        case "C":
            self = .celsius
        case "F":
            self = .fahrenheit
        default:
            return nil
        }
    }
}

let fahrenheitUnit = TemperatureUnit(symbol: "F")
if fahrenheitUnit != nil {
    print("This is a defined temperature unit, so initialization succeeded.")
}

let unkownUnit = TemperatureUnit(symbol: "X")
if unkownUnit == nil {
    print("This is not a defined temperature unit, so initialization failed.")
}

// 枚举值raw value 可失败的初始化函数
enum AnotherTemperatureUnit: Character {
    case kelvin = "K", celisus = "C", fahrenheit = "F"
}

let anotherFahrenheitUnit = AnotherTemperatureUnit(rawValue: "F")
if anotherFahrenheitUnit != nil {
    print("This is a defined temperature unit, so initialization succeeded.")
}

let anotherUnkownUnit = AnotherTemperatureUnit(rawValue: "X")
if anotherUnkownUnit == nil {
    print("This is not a defined temperature unit, so initialization failed.")
}

// 类的可失败初始化函数
class Product {
    let name: String
    init?(name: String)
    {
        if name.isEmpty {
            return nil
        }
        
        self.name = name
    }
}

class CarItem: Product {
    let quantity: Int
    init?(name: String, quantity: Int) {
        if  quantity < 1 {
            return nil
        }
        
        self.quantity = quantity
        super.init(name: name)
    }
}

if let twoSocks = CarItem(name: "sock", quantity: 2) {
    print("Item: \(twoSocks.name), quantity: \(twoSocks.quantity)")
}

if let zeroShirts = CarItem(name: "shirt", quantity: 0) {
    print("Item: \(zeroShirts.name), quantity: \(zeroShirts.quantity)")
} else {
    print("Unable to initialize zero shirts")
}

if let oneUnnamed = CarItem(name: "", quantity: 1) {
    print("Item: \(oneUnnamed.name), quantity: \(oneUnnamed.quantity)")
} else {
    print("Unable to initialize one unnamed product")
}

// 子类重写可失败的初始化函数
class Document {
    var name: String?
    init () {
        
    }
    
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        
        self.name = name
    }
}

class AutomaticallyNamedDocument: Document {
    override init(){
        super.init()
        self.name = "Untitled"
    }
    
    override init(name: String) {
        super.init()
        if name.isEmpty {
            self.name = "Untitled"
        } else {
            self.name = name
        }
    }
}

let oneDocument = AutomaticallyNamedDocument(name: "")
print(oneDocument.name!)

console log 如下


可失败的初始化函数.png

通过闭包或者函数设置属性值

// 通过闭包或者函数设置属性值
struct Chessboard {
    let boardColors: [Bool] = {
        var temporaryBoard = [Bool]()
        var isBlack = false
        for i in 1...8 {
            for j in 1...8 {
                temporaryBoard.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        
        return temporaryBoard
    }()
    
    func squareIsBlackAt(row: Int, column: Int) -> Bool {
        return boardColors[(row * 8) + column]
    }
}

let board = Chessboard()
print(board.squareIsBlackAt(0, column: 1))
print(board.squareIsBlackAt(7, column: 7))

console log 如下


通过闭包或者函数设置属性值.png
上一篇下一篇

猜你喜欢

热点阅读