1.在类的构造器前添加required修饰符表明所有该类的子类都必须实现该构造器
必要构造器实现的代码
class SomeClass {@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@
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@
错误处理:是响应错误以及从错误中恢复的过程。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@
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@
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@