classHuman{var name:String
var age:Int
init(_ name:String,_ age:Int) {
self.name = name
self.age = age
}
}
var human = Human("aaa", 30)
属性的缺省值
含有缺省值属性的构造方法
属性的初始值即缺省值
缺省构造方法
如果没有任何自定义的构造方法,系统将默认提供一个无任何参数的构造方法。
如果已经自定义构造方法,则系统提供的自动失效。
结构体的构造方法
结构体,系统会自动提供一个全参构造方法
如果自己声明了一个构造方法,则系统提供的全参构造方法自动失效
struct Size{
var width:Double
var height:Double
}
var size = Size(width: 20, height: 20)
枚举类型的构造方法
枚举不能通过类型的隠式解析调用构造方法,只有定义了构造方法,才可以像类那样构造对象
enum Color{
case Red
case Blue
case White
init() {
self = .Red
}
init(color:Color) {
self = color
}
}
var c1 = Color.Blue
var c2 = Color()
var c3 = Color(color: .Blue)
print(c1)
print(c2)
print(c3)
// 如果不声明构造方法,则c2/c3均不可用
classHuman{var name:String
var age:Int
var bankCardNumber:Double?
// 对于可选类型,默认值为nil
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
var man = Human(name: "WANG", age: 20)
print(man.name)
print(man.bankCardNumber)
常量属性与构造方法
对于常量属性,可以在构造方法内不对其赋值
常量属性只可以在定义的同时进行初始化,在构造方法内不可以对其再进行修改
class Human{
var name:Stringvar age:Int
let ID:Int =411111111var bankCardNumber:Double?// 对于可选类型,默认值为nil
init(name:String, age:Int,ID:Int) {
self.name = name
self.age = age
self.ID = ID // 不可以再次赋值
}
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
var man1 = Human(name: "WANG", age: 20)
var man2 = Human(name: "LI", age: 23, ID: 111111)
通过闭包或者函数设置属性的缺省值(默认值)
// 扑克牌种类enum PokerKind:String{
case heart = "♥"case diamond = "♦"case club = "♣"case spade = "♠"
}
// 扑克牌号码enum PokerNumber:String{
case NA = " A"case N2 = " 2"case N3 = " 3"case N4 = " 4"case N5 = " 5"case N6 = " 6"case N7 = " 7"case N8 = " 8"case N9 = " 9"case N10 = " 10"case NJ = " J"case NQ = " Q"case NK = " K"
}
// 扑克牌struct PokerCard{
var kind:PokerKind
var number:PokerNumber
var name:String{
return"\(kind)\(number)"
}
}
// 扑克牌选手
class PokerPalyer{
// 通过类方法 初始化staticvar pokerCardArray:[PokerCard] = PokerPalyer.setupCards()
// 通过闭包来随机产生13张牌var cards:[PokerCard] = {
var temp = [PokerCard]()
for i in0..<13 {
var s = Int(arc4random()) % pokerCardArray.count
temp.append(pokerCardArray.remove(at: s))
}
return temp
}()
/* 闭包的声明:
* {(参数:参数类型)->(返回值) in 执行语句}
* 注意此处的"()",如果没有则是声明一个闭包,并将闭包赋值给cards,因为有"()",所以执行了闭包。
*/// 类方法,初始化52张牌static func setupCards() -> [PokerCard]{
var temp = [PokerCard]()
var k:[PokerKind] = [.heart,.diamond,.spade,.club]
var n:[PokerNumber] = [.NA,.N2,.N3,.N4,.N5,.N6,.N7,.N8,.N9,.N10,.NJ,.NQ,.NK]
for i in0..<3 {
for j in0..<13 {
let card:PokerCard = PokerCard(kind: k[i], number: n[j])
temp.append(card)
}
}
return temp
}
}
// 构造四个扑克牌选手var palyer1 = PokerPalyer()
var palyer2 = PokerPalyer()
var palyer3 = PokerPalyer()
var palyer4 = PokerPalyer()
var players = [palyer1,palyer2,palyer3,palyer4];
// 遍历每个选手的扑克牌for player in players {
varstring:String = ""for card in player.cards {
string.append("\(card)")
}
print("选手:\(palyer1)\n扑克有:\(string)")
}
class Human{
var name:Stringvar age:Int
var bankCardNumber:Double?
init(name:String, age:Int) {
self.name = name
self.age = age
}
convenience init (){
self.init(name: "Li", age: 30)
}
}
class Man:Human{
// 跟父类相同的构造方法,但不是重写,故不用添加override关键字
convenience init(){
self.init(name: "WANG", age: 22)
}
}
var man = Man()
print(man.name) // WANG
classPerson{var height:Double?
var sex:Bool = true
}
extension Person{
var standardWeight:Double{
let e = self.sex ? 22.0 :20.0return height! * height! * e
}
}
var person = Person()
person.height = 30print(person.standardWeight) //19800.0
扩展构造方法
扩展的构造器只能是便捷构造方法,普通的构造方法需要在原始的类中声明。
扩展构造方法需要关键字:convenience
classPerson{var height:Double?
var sex:Bool = true
}
extension Person{
convenience init(height:Double) {
self.init()
self.height = height
}
}
var person = Person(height: 12.3)
扩展普通方法
扩展普通的方法。只需要声明即可,但是不可以和原始类中的方法名相同
扩展下标
在扩展内添加subscript下标
classCarriage{varname:String
init(name:String) {
self.name = name
}
}
classTrain{varcarriageArray:[Carriage] = []
init(number:Int) {
for i in1...number {
carriageArray.append(Carriage(name: "车厢:\(i)"))
}
}
}
extension Train{
subscript (index:Int)->Carriage{
return carriageArray[index]
}
}
let train = Train(number: 10)
print(train[1].name)
// 车厢:2