swift之方法(Methods)
最后更新于:2022-04-01 11:39:58
⽅法是与某些特定类型相关联的函数。
类、结构体、枚举都可以定义实例⽅法;实例⽅法为给定类型的实例封装了具体的任务与功能。
类、结构体、枚举也可以定义类型⽅法;类型⽅法与类型本⾝相关联。类型⽅法与 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)
~~~
(2)、在实例方法中修改值类型
结构体和枚举是值类型。⼀般情况下,值类型的属性不能在它的实例⽅法中被修改。但是,如果你确实需要在某个具体的⽅法中修改结构体或者枚举的属性,你可以选择 变异⽅法(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.0
~~~
2、类型方法(加关键字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
~~~