⽅法是与某些特定类型相关联的函数。
类、结构体、枚举都可以定义实例⽅法;实例⽅法为给定类型的实例封装了具体的任务与功能。
类、结构体、枚举也可以定义类型⽅法;类型⽅法与类型本⾝相关联。类型⽅法与 Objective-C 中的类⽅法(class methods)相似
结构体和枚举能够定义⽅法是 Swift 与 C/Objective-C 的主要区别之⼀
1、实例方法:
import Foundation class Person { var age = 1; var name = "xiaoming"; //这就是实例方法,定义在所属类型的前后大括号之间 //实例⽅法能够隐式访问它所属类型的所有的其他实例⽅法和属性 func printAge() { print("the \(self) age is \(self.age)") } func printNameAndAge(){ print("the \(self) name is \(self.name)") self.printAge() } } let p1 = Person() p1.printNameAndAge() p1.name = "dzl" p1.age = 12; p1.printNameAndAge() //the _5_swift之_方法.Person name is xiaoming //the _5_swift之_方法.Person age is 1 //the _5_swift之_方法.Person name is dzl //the _5_swift之_方法.Person age is 12类Person定义了两个属性,两个实例方法,其中实例方法printNameAndAge()调用实例方法printAge()
(1)、方法的局部参数名称和外部参数名称
Swift 默认仅给⽅法的第⼀个参数名称⼀个局部参数名称;默认同时给第⼆个和后续的参数名称局部参数名称和外部参数名称
class Cat { var name = "xiaohua" var age = 1 //这里newName只是局部参数名称,而newAge既是局部参数名称又是外部参数名称 func newNameAndAge(newName : String, newAge : Int) -> Void { self.name = newName self.age = newAge } //通过下划线(_)取消第二个及后续参数的默认外部参数名称 func useXiaHuaXian(newName : String, _ newAge : Int) { self.name = newName self.age = newAge } //自定义外部参数名称 func setNameAndAge(subNewName newName : String, subNewAge newAge : Int) { self.name = newName self.age = newAge } } var cat1 = Cat() cat1.newNameAndAge("cat1", newAge: 2) cat1.setNameAndAge(subNewName: "cat2", subNewAge: 3) cat1.useXiaHuaXian("cat3", 4)
结构体和枚举是值类型。⼀般情况下,值类型的属性不能在它的实例⽅法中被修改。但是,如果你确实需要在某个具体的⽅法中修改结构体或者枚举的属性,你可以选择 变异⽅法(mutating) 这个⽅法,然后⽅法就可以从⽅法内部改变它的属性;并且它做的任何改变在⽅法结束时还会保留在原始结构中。⽅法还可以给它隐含的 self 属性赋值⼀个全新的实例,这个新实例在⽅法结束后将替换原来的实例
struct MyPoint { var x = 0.0 var y = 0.0 mutating func changePoint(newX newX : Double, newY : Double) { x += newX y += newY } //⽅法还可以给它隐含的 self 属性赋值⼀个全新的实例,这个新实例在⽅法结束后将替换原来的实例 mutating func changeMyPoint(newX : Double, newY : Double) { self = MyPoint(x: x + newX, y: y + newY) } } var point1 = MyPoint(x: 2, y: 3) point1.changePoint(newX: 1, newY: 1); print("the point, x = \(point1.x) y = \(point1.y)") point1.changeMyPoint(2, newY: 2) print("the point, x = \(point1.x) y = \(point1.y)") //the point, x = 3.0 y = 4.0 //the point, x = 5.0 y = 6.02、类型方法(加关键字static)
enum EnumTypeFunc : Int{ case enum1 = 1 case enum2, enum3 static func getEnum2() -> EnumTypeFunc { return enum2 } } struct StructTypeFunc { static var name = "struct" static func getName() -> String { return name } } class ClassTypeFunc { static var name = "class" static func getName1() -> String { return name } //关键字class允许子类重写父类方法 class func getName2() -> String { return name } } print(EnumTypeFunc.getEnum2()) print(StructTypeFunc.getName()) print(ClassTypeFunc.getName1()) print(ClassTypeFunc.getName2()) //enum2 //struct //class //class