?法是與某些特定類型相關聯的函數。
類、結構體、枚舉都可以定義實例?法;實例?法為給定類型的實例封裝了具體的任務與功能。
類、結構體、枚舉也可以定義類型?法;類型?法與類型本?相關聯。類型?法與 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
~~~
- 前言
- swift控制語句,for,while,repeat-while,if,switch
- swift之聲明常量和變量
- swift之數值類型雜談(數值)
- swift之 元組
- oc與swift混編,OC調用swift,swift調用OC
- swift之可選類型
- swift之數組(Array)、集合(Set)、字典(Dictionary)
- swift之switch續(元組,值綁定,where)
- swift之控制轉移語句,continue,break,fallthrough,return,帶標簽的語句
- swift之函數(functions)
- swift之閉包(closure)
- swift之枚舉
- swift之類和結構體
- swift之屬性
- swift之方法(Methods)