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

前端之家收集整理的这篇文章主要介绍了swift基础学习(06)[必要构造器,可空链式调用,错误处理,类型转换]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.在类的构造器前添加required修饰符表明所有该类的子类都必须实现该构造器

必要构造器实现的代码

class SomeClass {@H_404_24@

required init(){@H_404_24@

@H_404_24@

}@H_404_24@

}@H_404_24@

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

@H_404_24@

class SomeSubClass: SomeClass {@H_404_24@

@H_404_24@

}@H_404_24@

}@H_404_24@

@H_404_24@

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

struct Checkerboard {@H_404_24@

let boardColors: [Bool] = {@H_404_24@

var temporaryBoard = [Bool]()@H_404_24@

var isBlack = false@H_404_24@

for i in 1...10 {@H_404_24@

for j in 1...10 {@H_404_24@

temporaryBoard.append(isBlack)@H_404_24@

isBlack = !isBlack@H_404_24@

}@H_404_24@

isBlack = !isBlack@H_404_24@

}@H_404_24@

return temporaryBoard@H_404_24@

}()@H_404_24@

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

return boardColors[(row * 10) + column]@H_404_24@

}@H_404_24@

}@H_404_24@

let board = Checkerboard()@H_404_24@

print(board.squareIsBlackAtRow(0,column: 1))@H_404_24@ 2. 可空链式调用

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

class Person {@H_404_24@

var residence:Residence?@H_404_24@

}@H_404_24@


@H_404_24@

class Residence {@H_404_24@

var rooms = [Room]()@H_404_24@

var numberOfRooms: Int {@H_404_24@

return rooms.count@H_404_24@

}@H_404_24@

subscript(i: Int) -> Room {@H_404_24@

get {@H_404_24@

return rooms[i]@H_404_24@

}@H_404_24@

set {@H_404_24@

rooms[i] = newValue@H_404_24@

} }@H_404_24@

func printNumberOfRooms() {@H_404_24@

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

}@H_404_24@

var address: Address?@H_404_24@

}@H_404_24@


@H_404_24@

class Room {@H_404_24@

let name: String@H_404_24@

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

}@H_404_24@


@H_404_24@

class Address {@H_404_24@

var buildingName: String?@H_404_24@

var buildingNumber: String?@H_404_24@

var street: String?@H_404_24@

func buildingIdentifier() -> String? {@H_404_24@

if buildingName != nil {@H_404_24@

return buildingName@H_404_24@

} else if buildingNumber != nil {@H_404_24@

return buildingNumber@H_404_24@

} else {@H_404_24@

return nil@H_404_24@

} }@H_404_24@

}@H_404_24@

3.

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

@H_404_24@

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

enum VendingMachineError:ErrorType {@H_404_24@

case InvalidSelection//选择无效@H_404_24@

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

case OutOfStock//缺货@H_404_24@

}@H_404_24@

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

do-catch处理错误@H_404_24@

4.@H_404_24@

类型转换@H_404_24@

@H_404_24@

class MediaItem {@H_404_24@

var name: String@H_404_24@

init(name:String){@H_404_24@

self.name = name@H_404_24@

}@H_404_24@

}@H_404_24@

class Movie:MediaItem {@H_404_24@

var director:String@H_404_24@

init(name:String,director:String){@H_404_24@

self.director = director@H_404_24@

super.init(name: name)@H_404_24@

}@H_404_24@

}@H_404_24@

class Song: MediaItem {@H_404_24@

var artist:String@H_404_24@

init(name:String,artist:String){@H_404_24@

self.artist = artist@H_404_24@

super.init(name: name)@H_404_24@

}@H_404_24@

}@H_404_24@

给一个数组常量@H_404_24@

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

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

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

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

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

]@H_404_24@

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

var movieCount = 0@H_404_24@

var songCount = 0@H_404_24@

for item in library {@H_404_24@

if item is Movie {@H_404_24@

++movieCount@H_404_24@

} else if item is Song {@H_404_24@

++songCount@H_404_24@

}@H_404_24@

}@H_404_24@

print(movieCount,songCount)@H_404_24@

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

for item in library {@H_404_24@

if let movie = item as? Movie {@H_404_24@

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

} else if let song = item as? Song {@H_404_24@

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

}@H_404_24@

}@H_404_24@

any anyobject的类型转换@H_404_24@

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

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

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

let someObjects: [AnyObject] = [@H_404_24@

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

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

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

]@H_404_24@

for object in someObjects {@H_404_24@

let movie = object as! Movie@H_404_24@

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

}@H_404_24@


@H_404_24@

any类型@H_404_24@

var things = [Any]()@H_404_24@

things.append(0)@H_404_24@

things.append(0.0)@H_404_24@

things.append(42)@H_404_24@

things.append(3.1415126)@H_404_24@

things.append("hello")@H_404_24@

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

猜你在找的Swift相关文章