swift基础学习(06)[必要构造器,可空链式调用,错误处理,类型转换]

4 篇文章 0 订阅
1.在类的构造器前添加required修饰符表明所有该类的子类都必须实现该构造器
必要构造器实现的代码

class SomeClass {

    required init(){

 

    }

}

子类重写父类的必要构造器方法实现的代码不需要添加override

class SomeSubClass: SomeClass {

    required init(){

    

    }

}

通过设置闭包和函数来设置属性的默认值


struct Checkerboard {

    let boardColors: [Bool] = {

        var temporaryBoard = [Bool]()

        var isBlack = false

        for i in 1...10 {

            for j in 1...10 {

                temporaryBoard.append(isBlack)

                isBlack = !isBlack

            }

            isBlack = !isBlack

        }

        return temporaryBoard

    }()

    func squareIsBlackAtRow(row: Int, column: Int) -> Bool {

        return boardColors[(row * 10) + column]

    }

}

let board = Checkerboard()

print(board.squareIsBlackAtRow(0, column: 1))

2. 可空链式调用

是一种可以请求和调用属性、方法及下标的过程,它的可控件体现于请求或调用的目标当前可能为空,如果可空的目标有值,那么调用就会成功,如果选择的目标为空,那么这种调用将返回空,多个连续调用可以背链接在一起形成一个调用链,如果其中任何一个节点为空将导致整个链调用失败

class  Person {

    var residence:Residence?

}


class Residence {

    var rooms = [Room]()

    var numberOfRooms: Int {

        return rooms.count

    }

    subscript(i: Int) -> Room {

        get {

            return rooms[i]

        }

        set {

            rooms[i] = newValue

        } }

    func printNumberOfRooms() {

        print("The number of rooms is \(numberOfRooms)")

    }

    var address: Address?

}


class Room {

    let name: String

    init(name: String) { self.name = name }

}


class Address {

    var buildingName: String?

    var buildingNumber: String?

    var street: String?

    func buildingIdentifier() -> String? {

        if buildingName != nil {

            return buildingName

        } else if buildingNumber != nil {

            return buildingNumber

        } else {

            return nil

        } }

}

3.

错误处理:是响应错误以及从错误中恢复的过程。swift提供了在运行对可恢复错误抛出,捕获传送和操作的高级支持

表示并抛出错误:Swift,错误用遵循 ErrorType 协议类型的值来表示

enum VendingMachineError:ErrorType {

    case InvalidSelection//选择无效

    case InsufficientFunds(coinsNeed:Int)//金额不足

    case OutOfStock//缺货

}

错误处理:throwing函数传递错误

do-catch处理错误

4.

类型转换

class MediaItem {

    var name: String

    init(name:String){

        self.name = name

    }

}

class Movie:MediaItem {

    var  director:String

    init(name:String,director:String){

        self.director = director

        super.init(name: name)

    }

}

class Song: MediaItem {

    var  artist:String

    init(name:String,artist:String){

        self.artist = artist

        super.init(name: name)

    }

}

给一个数组常量

let library = [ Movie(name: "Casablanca", director: "Michael Curtiz"),

                Song(name: "Blue Suede Shoes", artist: "Elvis Presley"),

                Movie(name: "Citizen Kane", director: "Orson Welles"),

                Song(name: "The One And Only", artist: "Chesney Hawkes"),

                Song(name: "Never Gonna Give You Up", artist: "Rick Astley")

]

//检查类型:用类型检查操作符( is )来检查一个实例是否属于特定子类型

var movieCount = 0

var  songCount = 0

for item in library {

    if item is Movie {

    ++movieCount

    } else if item is Song {

    ++songCount

    }

}

print(movieCount,songCount)

向下转型:某类型的一个常量或变量可能在幕后实际上属于一个子类。当确定是这种情况时,你可以尝试向下转到它的子类型,用类型转换操作符(as? as!)

for item in library {

    if let movie = item as? Movie {

    print("Movie:'\(movie.name)',dir.\(movie.director)")

    } else if let song = item as? Song {

    print("Song:'\(song.name)',by \(song.artist)")

    }

}

any anyobject的类型转换

swift为不确定类型提供了特殊类型别名

anyobject 可以代表任何class类型的实例

any 可以表示任何类型,包括方法类型

let someObjects: [AnyObject] = [

    Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),

    Movie(name: "Moon", director: "Duncan Jones"),

    Movie(name: "Alien", director: "Ridley Scott")

]

for object in someObjects {

    let movie = object as! Movie

    print("Movie: '\(movie.name)', dir. \(movie.director)")

}


any类型

var things = [Any]()

things.append(0)

things.append(0.0)

things.append(42)

things.append(3.1415126)

things.append("hello")

things.append(Movie(name:"lihuan",director: "hello"))




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值