隸屬于每一個(gè)類(lèi)或結(jié)構(gòu)體的函數(shù)稱(chēng)之為方法:
方法分為類(lèi)方法和實(shí)例方法, 對(duì)應(yīng)OC中的 + - 方法
實(shí)例方法:實(shí)例方法一定是通過(guò)對(duì)象來(lái)調(diào)用的, 實(shí)例方法隸屬于某一個(gè)類(lèi)
class Person {
var _name:String = "solozyx"
var _age:Int = 99
// 實(shí)例方法一定是通過(guò)對(duì)象來(lái)調(diào)用的, 實(shí)例方法隸屬于某一個(gè)類(lèi)
// func setName(name:String, age:Int)
// 如果不希望某個(gè)參數(shù)作為外部參數(shù), 可以在參數(shù)前面加上_, 忽略外部參數(shù)
func setName(name:String, _ age:Int)
{
_name = name
_age = age
}
func show()
{
print("name = \(_name) age = \(_age)")
}
}
var p = Person()
// 由于第一個(gè)參數(shù)可以通過(guò)方法名稱(chēng)指定, 所以默認(rèn)第一個(gè)參數(shù)不作為外部參數(shù)
//p.setName("zs", age: 88) // 錯(cuò)誤
p.setName("zs", 88)
//func setName(name:String, age:Int){
//func setName(name:String,myAge age:Int){
func setName(name:String, age:Int){
}
// 實(shí)例方法和函數(shù)的區(qū)別在于, 實(shí)例方法會(huì)自動(dòng)將除第一個(gè)參數(shù)以外的其它參數(shù)即當(dāng)做外部參數(shù)又當(dāng)做內(nèi)部參數(shù), 而函數(shù)需要我們自己指定才會(huì)有外部參數(shù), 默認(rèn)沒(méi)有
setName("ls", age:55)
self關(guān)鍵字, Swift中的self和OC中的self基本一樣. self指當(dāng)前對(duì)象, 如果self在對(duì)象方法中代表當(dāng)前對(duì)象. 但是在類(lèi)方法中沒(méi)有self
class Person2 {
var name:String = "solozyx"
var age:Int = 99
// 當(dāng)參數(shù)名稱(chēng)和屬性名稱(chēng)一模一樣時(shí), 無(wú)法區(qū)分哪個(gè)是參數(shù)哪個(gè)是屬性, 這個(gè)時(shí)候可以通過(guò)self明確的來(lái)區(qū)分參數(shù)和屬性
func setName(name:String, age:Int)
{
// 默認(rèn)情況下, _name和_age前面有一個(gè)默認(rèn)的self關(guān)鍵字, 因?yàn)樗凶兞慷夹枰榷x再使用, 而setName方法中并沒(méi)有定義過(guò)_name和_age, 而是在屬性中定義的, 所以setName中訪問(wèn)的其實(shí)是屬性, 編譯器默認(rèn)幫我們?cè)谇懊婕恿艘粋€(gè)self.
// _name = name
// _age = age
self.name = name
self.age = age
}
func show()
{
print("name = \(name) age = \(age)")
}
}
mutating方法
值類(lèi)型(結(jié)構(gòu)體和枚舉)默認(rèn)方法是不可以修改屬性的, 如果需要修改屬性, 需要在方法前加上mutating關(guān)鍵字, 讓該方法變?yōu)橐粋€(gè)改變方法
struct Person3 {
var name:String = "solozyx"
var age:Int = 99
// 值類(lèi)型(結(jié)構(gòu)體和枚舉)默認(rèn)方法是不可以修改屬性的, 如果需要修改屬性, 需要在方法前加上mutating關(guān)鍵字, 讓該方法變?yōu)橐粋€(gè)改變方法
// 注意: 類(lèi)不需要, 因?yàn)轭?lèi)的實(shí)例方法默認(rèn)就可以修改
mutating func setName(name:String, age:Int)
{
self.name = name
self.age = age
}
func show()
{
print("name = \(name) age = \(age)")
}
}
var p3 = Person3()
p3.setName("zs", age: 99)
p3.show()
enum LightSwitch{
case OFF, ON
mutating func next()
{
switch self{
case OFF:
self = ON
case ON:
self = OFF
}
}
}
var ls:LightSwitch = LightSwitch.OFF
if ls == LightSwitch.OFF
{
print("off")
}
ls.next()
if ls == LightSwitch.ON
{
print("on")
}
struct Person4 {
var name:String = "solozyx"
static var card: String = "123456"
func show()
{
print("name = \(self.name) card = \(Person4.card)")
}
static func staticShow()
{
// 類(lèi)方法中沒(méi)有self
// print("name = \(self.name) card = \(Person.card)")
// 靜態(tài)方法對(duì)應(yīng)OC中的+號(hào)方法, 和OC一樣在類(lèi)方法中不能訪問(wèn)非靜態(tài)屬性
print("card = \(Person4.card)")
}
}
var p4 = Person4()
p4.show()
Person4.staticShow()
class Person5 {
var name:String = "solozyx"
class var card: String {
return "123456"
}
func show()
{
print("name = \(self.name) card = \(Person5.card)")
}
class func staticShow()
{
// 類(lèi)方法中沒(méi)有self
// print("name = \(self.name) card = \(Person.card)")
// 靜態(tài)方法對(duì)應(yīng)OC中的+號(hào)方法, 和OC一樣在類(lèi)方法中不能訪問(wèn)非靜態(tài)屬性
print("card = \(Person5.card)")
}
}
var p5 = Person5()
p5.show()
Person5.staticShow()