程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift教程之辦法詳解

Swift教程之辦法詳解

編輯:更多關於編程

Swift教程之辦法詳解。本站提示廣大學習愛好者:(Swift教程之辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift教程之辦法詳解正文


辦法是聯系關系到一個特定類型的函數。類、構造、列舉一切可以界說實例辦法,封裝特定義務和功效處置給定類型的一個實例。類、構造、列舉類型還可以界說辦法,相干的類型自己。類型辦法相似於objective – c類辦法。

構造和列舉可以界說辦法swift與C和objective – C是一個嚴重的差別。在objective – c中,類是獨一類型可以界說辦法。在swift,你可以選擇能否要界說一個類,構造,或列舉,還有你界說辦法類型的靈巧性發明。

1、實例辦法

實例辦法是屬於一個特定的類,構造或列舉實例的功效。他們支撐這些實例的功效,不管是經由過程供給辦法來拜訪和修正實例屬性,或供給的功效與實例的目標。實例辦法具有完整雷同的語法功效,如功效描寫
你所屬的類型的翻開和封閉括號內寫一個實例辦法。一個實例辦法具有隱式拜訪一切其他實例辦法和該類型的屬性。一個實例辦法只能在它所屬的類的特定實例挪用,它不克不及拜訪一個不存在的實例。
這裡,界說了一個簡略的計數器類,它可以用來計數一個舉措產生的次數的示例:


class Counter {
var count = 0
func increment() {
count++
}
func incrementBy(amount: Int) {
count += amount
}
func reset() {
count = 0
}
}

counter類可以界說三個實例辦法:
增量遞增計數器1。
incrementBy(amount:Int)由指定的整數金額遞增計數器。
重置將計數器的值重置為零。
計數類也聲清楚明了一個變量屬性,統計,跟蹤以後的計數器值。
你挪用實例辦法具有雷同點語法的屬性

 
let counter = Counter()
// the initial counter value is 0
counter.increment()
// the counter's value is now 1
counter.incrementBy(5)
// the counter's value is now 6
counter.reset()
// the counter's value is now 0

當地和內部參數稱號的辦法

函數參數可以有一個當地稱號(在函數體內應用)和內部稱號(在挪用函數時應用),所述內部參數稱號。辦法參數也是如斯,由於辦法與類型相干的函數。但是,當地稱號和內部稱號的默許行動是分歧的函數和辦法。

辦法在Swift異常相似於objective – c的同業。在objective – c中,一個辦法的稱號在Swift平日是指應用preposition等辦法的第一個參數,,或許,就像在incrementBy辦法早年面的counter類的例子。應用可以被解讀為一個斷定的辦法叫做preposition。Swift使這個辦法樹立定名商定易於編寫經由過程應用一個分歧的默許辦法。

詳細來講,Swift給第一個參數稱號辦法默許當地參數稱號,並給出第二和後續的參數稱號默許當地和內部參數稱號。這個商定可以在熟習的objective – c中挪用到,並使得表達辦法挪用而不須要相符你的參數稱號。

斟酌這個替換版本的counter類,它界說了一個更龐雜的情勢的incrementBy辦法:

 
class Counter {
var count: Int = 0
func incrementBy(amount: Int, numberOfTimes: Int) {
count += amount * numberOfTimes
}
}

這有兩個parameters-amount和numberOfTimes incrementBy辦法。默許情形下,Swift將amount視為當地稱號,但將numberOfTimes視為當地和內部稱號。您挪用的辦法以下:

 
let counter = Counter()
counter.incrementBy(5, numberOfTimes: 3)
// counter value is now 15

你不須要界說一個內部參數稱號為第一個參數值,由於它是明白的函數名incrementBy。但是,第二個參數是由內部參數稱號停止限制。
這類默許行動有用的內部辦法,假如你有numberOfTimes參數之前寫了一個hash符號(#):


func incrementBy(amount: Int, #numberOfTimes: Int) {
count += amount * numberOfTimes
}

下面描寫的默許行動在Swift寫入雷同的辦法界說,語法相似於objective – c,可以更便利地被挪用。

  修正內部參數稱號的行動辦法

有時是有效的供給一個內部辦法的第一個參數的參數稱號,即便這不是默許行動。你本身可以添加一個顯式的內部稱號,或許你可以用一個散列前綴的名字的第一個參數標記應用當地稱號作為內部的名字。
相反,假如你不想為第二個供給內部稱號或後續參數的辦法,籠罩默許行動經由過程應用下劃線字符(_)作為一個明白的內部參數稱號參數。

  Self屬性

一個類型的每一個實例都有所謂的一個隱含self屬性,它是完整同等於該實例自己。您可使用這個隱含的self屬性來援用以後實例中它本身的實例辦法。

在下面的例子中,增量辦法也能夠寫成如許:


func increment() {
self.count++
}

在理論中,你不須要寫self,這在你的代碼會異常頻仍。假如你沒有明白寫self,Swift假定你是指以後實例的屬性或辦法,每當你應用一個辦法中一個已知的屬性或辦法名。這個假定是證實了裡邊三個實例辦法的計數器應用count(rather than self.count)的。
重要的破例產生在一個實例辦法的參數稱號雷同的稱號作為該實例的屬性。在這類情形下,參數稱號的優先,有需要參考屬性更多及格的方法。您可使用隱式的自我屬性的參數名和屬性名來辨別。
假如一個辦法參數叫x,還有一個實例屬性也叫x,在Swift中可以主動對兩個x清除歧義,不會混雜。

 
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x: Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x: 4.0, y: 5.0)
if somePoint.isToTheRightOfX(1.0) {
println("This point is to the right of the line where x == 1.0")
}
// prints "This point is to the right of the line where x == 1.0"

假如沒有self前綴,Swift將假定x的兩種用法稱為X的辦法參數

修正值類型的實例辦法

構造和列舉值類型。默許情形下,一個值類型的屬性不克不及修正它的實例辦法
但是,假如您須要修正的屬性構造或列舉在一個特定的辦法,你可以選擇該辦法的變更行動。但任何更改都邑使它得編寫的辦法停止時回到本來的構造。當該辦法停止時還可以分派一個完整新的實例對其隱含的self屬性,而這個新的實例將代替現有的。
你可以選擇這個行動之前將變異的症結字嵌入函數症結字的辦法:


struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)
println("The point is now at (\(somePoint.x), \(somePoint.y))")
// prints "The point is now at (3.0, 4.0)"

Point構造下面界說了一個變異moveByX辦法,它經由過程必定量挪動一個Point實例。而不是前往一個新的終點,這類辦法現實上會修正在其上挪用點。該變異包括被添加到它的界說,使其可以或許修正其屬性。
請留意,您不克不及挪用變異辦法構造類型的常數,由於它的屬性不克不及轉變,即便它們是可變的特征,如在固定構造實例存儲的屬性描寫:

 
let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveByX(2.0, y: 3.0)
// this will report an error

分派中的self變異辦法
變異的辦法可以分派一個全新的實例隱含的self屬性。下面所示的點的例子也能夠寫成上面的方法來取代:


struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}

此版本的漸變moveByX辦法創立一個全新的構造,它的x和y值被設置到目的地位。挪用該辦法的成果和晚期版本是完整一樣的

變異的辦法列舉可以設置self參數是從統一個列舉分歧的成員


enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight is now equal to .High
ovenLight.next()
// ovenLight is now equal to .Off

這個例子界說了一個三態開關列舉。三種分歧的功率狀況之間的切換周期(關,低,高)

2、類型辦法

如上所述,實例辦法的辦法請求一個特定類型的實例。您還可以界說該類型本身的辦法,這類辦法被稱為type辦法,您顯示的type辦法直接在類構造體外面用class func開首 ,關於列舉和構造來講,類型辦法是用static func開首。
請留意;
在objective – c中,您可以界說type-level辦法僅為objective – c類。在Swift可認為一切類界說type-level辦法,構造,和列舉。每種辦法的顯示局限於它所支撐的類型。
類型辦法挪用dot syntax,就像實例辦法。然則,您挪用的是類型的辦法,而不是該類型的一個實例。這裡是你若何挪用一個類挪用SomeClass的一個類型的辦法:

 
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()

在類型辦法的主體,隱含的self屬性是指類型自己,而不是該類型的一個實例。關於構造體和列舉,這意味著你可使用自助靜態屬性和靜態辦法的參數清除歧義,就像你做的實例屬性和實例辦法的參數。

更廣泛的是,你一個類型的辦法體中應用任何不及格的辦法和屬性稱號會參考其他 type-level辦法和屬性。 一種辦法可以挪用另外一個類的辦法與其他辦法的稱號,而不須要與類型稱號前綴了。異樣,構造和列舉類型的辦法可使用靜態屬性的稱號,沒有類型稱號前綴拜訪靜態屬性。

上面的例子界說了一個名為LevelTracker構造,它經由過程游戲的分歧條理或階段跟蹤球員的提高。這是一個單人游戲,但可以存儲的信息為一個單一的裝備上的多個玩家。

一切的游戲的程度(除一級)當游戲第一次玩。每當玩家完成一個級別,該級別解鎖裝備上的一切玩家。LevelTracker構造應用靜態屬性和辦法來跟蹤哪些級其余競賽曾經解鎖。它還跟蹤以後個體球員程度


struct LevelTracker {
static var highestUnlockedLevel = 1
static func unlockLevel(level: Int) {
if level > highestUnlockedLevel {
highestUnlockedLevel = level
}
}
static func levelIsUnlocked(level: Int) -> Bool {
return level <= highestUnlockedLevel
}
var currentLevel = 1
mutating func advanceToLevel(level: Int) -> Bool {
if LevelTracker.levelIsUnlocked(level) {
currentLevel = level
return true
} else {
return false
}
}
}

該LevelTracker構造跟蹤任何玩家解鎖的最高程度。這個值是存儲在一個名為highestUnlockedLevel的靜態屬性。

LevelTracker還界說了兩品種型的功效與highestUnlockedLevel,起首是一種叫做unlockLevel功效,每當一個新的程度解鎖都邑用來更新highestUnlockedLevel,第二個是levelIsUnlocked功效,假如一個特定的程度數曾經解鎖,就會前往ture。留意,這些類型的辦法可以拜訪highestUnlockedLevel靜態屬性然則你須要把它寫成LevelTracker.highestUnlockedLevel)。

除它的靜態屬性和類型的辦法,LevelTracker經由過程游戲追蹤每一個玩家的進度。它應用被稱為currentLevel實例屬性來跟蹤玩家級別。
為了贊助治理urrentLevel屬性,advanceToLevel LevelTracker界說一個實例辦法。這類辦法更新currentLevel之前,用來檢討能否請求新的程度曾經消除鎖定。該advanceToLevel辦法前往一個布爾值來指導它能否可以或許設置currentLevel。
該LevelTracker構造應用Player類,以下所示,跟蹤和更新單個球員的提高:


class Player {
var tracker = LevelTracker()
let playerName: String
func completedLevel(level: Int) {
LevelTracker.unlockLevel(level + 1)
tracker.advanceToLevel(level + 1)
}
init(name: String) {
playerName = name
}
}

Player類創立LevelTracker的一個新實例來跟蹤球員的提高。它也供給了一個名為completedLevel辦法,每當玩家達到一個特定的級別,這類辦法就會解鎖一個新的級別和進度並把玩家移到下一個級別。(advanceToLevel前往的布爾值將被疏忽,由於已知被挪用LevelTracker.unlockLevel。)
您可以創立一個新球員Player 的實例,看看當玩家完成一個級別會產生甚麼:

 
var player = Player(name: "Argyrios")
player.completedLevel(1)
println("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
// prints "highest unlocked level is now 2"

假如你創立第二個球員,你想測驗考試挪動到還沒有被游戲解鎖的級別,就會湧現以後級別掉敗

 
player = Player(name: "Beto")
if player.tracker.advanceToLevel(6) {
println("player is now on level 6")
} else {
println("level 6 has not yet been unlocked")
}
// prints "level 6 has not yet been unlocked"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved