*:结构体是传值,类是传引用
构造方法分为指定构造方法和便利构造方法
便利构造方法以 convenience 开头:例:convenience init(){ ... }
指定构造方法必须调用其父类的指定构造方法
便利构造方法必须调用同一类中定义的其他构造方法
便利构造方法必须最终以调用一个指定构造方法结束
只有指定构造方法才能调用父类的其他构造方法
只有便利构造方法才能调用当前类的其他构造方法
class Dog{
var name:String
var age:Int
init(name:String, age:Int){
self.name = name
self.age = age
}
convenience init(name:String){
self.init(name:name, age:1)
}
convenience init(age:Int){
self.init(name:"no name", age:age)
}
}
***********************************
class Animal{
init(){
println("Animal-init")
}
}
class Dog:Animal{
init(){
println("Dog-init")
}
}
var d = Dog()
***************************************
在实例方法中修改值类型
Swift 语言中结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。
方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
struct area {
var length = 1
var breadth = 1
func area() -> Int {
return length * breadth
}
mutating func scaleBy(res: Int) {
length *= res
breadth *= res
print(length)
print(breadth)
}
}
var val = area(length: 3, breadth: 5) // ?? (self)
val.scaleBy(3)
val.scaleBy(30)
val.scaleBy(300)
以上程序执行输出结果为:
9
15
270
450
81000
135000
*******************************************************
类型方法
实例方法是被类型的某个实例调用的方法,你也可以定义类型本身调用的方法,这种方法就叫做类型方法。
声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static。类可能会用关键字class来允许子类重写父类的实现方法。
类型方法和实例方法一样用点号(.)语法调用。
class Math{
class func abs(number: Int) -> Int{
if number < 0{
return (-number)
}
else{
return number
}
}
}
struct absno{
static func abs(number: Int) -> Int{
if number < 0{
return (-number)
}
else{
return number
}
}
}
let no = Math.abs(-35)
let num = absno.abs(-5)
print(no)
print(num)
*********************************************
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length (sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)
*****************************************************************
class TriangleAndSquare {
var triangle: EquilateralTriangle {
willSet {
square.sideLength = newValue.sideLength
}
}
var square: Square {
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)
*********************************************************************
在实例方法中修改值类型
Swift 语言中结构体和枚举是值类型。一般情况下,值类型的属性不能在它的实例方法中被修改。
但是,如果你确实需要在某个具体的方法中修改结构体或者枚举的属性,你可以选择变异(mutating)这个方法,然后方法就可以从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。
方法还可以给它隐含的self属性赋值一个全新的实例,这个新实例在方法结束后将替换原来的实例。
struct area{
var length = 1
var breadth = 1
func area() -> Int{
return length * breadth
}
mutating func scaleBy(res:Int){
length *= res
breadth *= res
println(length)
println(breadth)
}
}
var a = area(length:3, breadth:2)
a.scaleBy(3)
a.length
a.breadth