【移動應(yīng)用開發(fā)技術(shù)】2.12 下標腳本(Subscripts)_第1頁
【移動應(yīng)用開發(fā)技術(shù)】2.12 下標腳本(Subscripts)_第2頁
【移動應(yīng)用開發(fā)技術(shù)】2.12 下標腳本(Subscripts)_第3頁
【移動應(yīng)用開發(fā)技術(shù)】2.12 下標腳本(Subscripts)_第4頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】2.12下標腳本(Subscripts)

本頁包含內(nèi)容:下標腳本語法下標腳本用法下標腳本選項下標腳本

可以定義在類(Class)、結(jié)構(gòu)體(structure)和枚舉(enumeration)這些目標中,可以認為是訪問對象、集合或序列的快捷方式,不需要再調(diào)用實例的特定的賦值和訪問方法。舉例來說,用下標腳本訪問一個數(shù)組(Array)實例中的元素可以這樣寫

someArray[index]

,訪問字典(Dictionary)實例中的元素可以這樣寫someDictionary[key]。對于同一個目標可以定義多個下標腳本,通過索引值類型的不同來進行重載,而且索引值的個數(shù)可以是多個。譯者:這里附屬腳本重載在本小節(jié)中原文并沒有任何演示譯者:這里附屬腳本重載在本小節(jié)中原文并沒有任何演示下標腳本語法下標腳本允許你通過在實例后面的方括號中傳入一個或者多個的索引值來對實例進行訪問和賦值。語法類似于實例方法和計算型屬性的混合。與定義實例方法類似,定義下標腳本使用subscript關(guān)鍵字,顯式聲明入?yún)ⅲㄒ粋€或多個)和返回類型。與實例方法不同的是下標腳本可以設(shè)定為讀寫或只讀。這種方式又有點像計算型屬性的getter和setter:subscript(index:

Int)

->

Int

{

get

{

//

返回與入?yún)⑵ヅ涞腎nt類型的值

}

set(newValue)

{

//

執(zhí)行賦值操作

}

}newValue的類型必須和下標腳本定義的返回類型相同。與計算型屬性相同的是set的入?yún)⒙暶鱪ewValue就算不寫,在set代碼塊中依然可以使用默認的newValue這個變量來訪問新賦的值。與只讀計算型屬性一樣,可以直接將原本應(yīng)該寫在get代碼塊中的代碼寫在subscript中:subscript(index:

Int)

->

Int

{

//

返回與入?yún)⑵ヅ涞腎nt類型的值}下面代碼演示了一個在TimesTable結(jié)構(gòu)體中使用只讀下標腳本的用法,該結(jié)構(gòu)體用來展示傳入整數(shù)的n倍。struct

TimesTable

{

let

multiplier:

Int

subscript(index:

Int)

->

Int

{

return

multiplier

*

index

}

}let

threeTimesTable

=

TimesTable(multiplier:

3)println("3的6倍是\(threeTimesTable[6])")//

輸出

"3的6倍是18"在上例中,通過TimesTable結(jié)構(gòu)體創(chuàng)建了一個用來表示索引值三倍的實例。數(shù)值3作為結(jié)構(gòu)體構(gòu)造函數(shù)入?yún)⒊跏蓟瘜嵗蓡Tmultiplier。你可以通過下標腳本來得到結(jié)果,比如threeTimesTable[6]。這條語句訪問了threeTimesTable的第六個元素,返回6的3倍即18。注意:TimesTable例子是基于一個固定的數(shù)學公式。它并不適合開放寫權(quán)限來對threeTimesTable[someIndex]進行賦值操作,這也是為什么附屬腳本只定義為只讀的原因。注意:TimesTable例子是基于一個固定的數(shù)學公式。它并不適合開放寫權(quán)限來對threeTimesTable[someIndex]進行賦值操作,這也是為什么附屬腳本只定義為只讀的原因。下標腳本用法根據(jù)使用場景不同下標腳本也具有不同的含義。通常下標腳本是用來訪問集合(collection),列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的類或結(jié)構(gòu)體中自由的實現(xiàn)下標腳本來提供合適的功能。例如,Swift的字典(Dictionary)實現(xiàn)了通過下標腳本來對其實例中存放的值進行存取操作。在下標腳本中使用和字典索引相同類型的值,并且把一個字典值類型的值賦值給這個下標腳本來為字典設(shè)值:var

numberOfLegs

=

["spider":

8,

"ant":

6,

"cat":

4]

numberOfLegs["bird"]

=

2上例定義一個名為numberOfLegs的變量并用一個字典字面量初始化出了包含三對鍵值的字典實例。numberOfLegs的字典存放值類型推斷為Dictionary<String,Int>。字典實例創(chuàng)建完成之后通過下標腳本的方式將整型值2賦值到字典實例的索引為bird的位置中。更多關(guān)于字典(Dictionary)下標腳本的信息請參考讀取和修改字典注意:Swift中字典的附屬腳本實現(xiàn)中,在get部分返回值是Int?,上例中的numberOfLegs字典通過附屬腳本返回的是一個Int?或者說“可選的int”,不是每個字典的索引都能得到一個整型值,對于沒有設(shè)過值的索引的訪問返回的結(jié)果就是nil;同樣想要從字典實例中刪除某個索引下的值也只需要給這個索引賦值為nil即可。注意:Swift中字典的附屬腳本實現(xiàn)中,在get部分返回值是Int?,上例中的numberOfLegs字典通過附屬腳本返回的是一個Int?或者說“可選的int”,不是每個字典的索引都能得到一個整型值,對于沒有設(shè)過值的索引的訪問返回的結(jié)果就是nil;同樣想要從字典實例中刪除某個索引下的值也只需要給這個索引賦值為nil即可。下標腳本選項下標腳本允許任意數(shù)量的入?yún)⑺饕⑶颐總€入?yún)㈩愋鸵矝]有限制。下標腳本的返回值也可以是任何類型。下標腳本可以使用變量參數(shù)和可變參數(shù),但使用寫入讀出(in-out)參數(shù)或給參數(shù)設(shè)置默認值都是不允許的。一個類或結(jié)構(gòu)體可以根據(jù)自身需要提供多個下標腳本實現(xiàn),在定義下標腳本時通過入?yún)€類型進行區(qū)分,使用下標腳本時會自動匹配合適的下標腳本實現(xiàn)運行,這就是下標腳本的重載。一個下標腳本入?yún)⑹亲畛R姷那闆r,但只要有合適的場景也可以定義多個下標腳本入?yún)ⅰH缦吕x了一個Matrix結(jié)構(gòu)體,將呈現(xiàn)一個Double類型的二維矩陣。Matrix結(jié)構(gòu)體的下標腳本需要兩個整型參數(shù):struct

Matrix

{

let

rows:

Int,

columns:

Int

var

grid:

Double[]

init(rows:

Int,

columns:

Int)

{

self.rows

=

rows

self.columns

=

columns

grid

=

Array(count:

rows

*

columns,

repeatedValue:

0.0)

}

func

indexIsValidForRow(row:

Int,

column:

Int)

->

Bool

{

return

row

>=

0

&&

row

<

rows

&&

column

>=

0

&&

column

<

columns

}

subscript(row:

Int,

column:

Int)

->

Double

{

get

{

assert(indexIsValidForRow(row,

column:

column),

"Index

out

of

range")

return

grid[(row

*

columns)

+

column]

}

set

{

assert(indexIsValidForRow(row,

column:

column),

"Index

out

of

range")

grid[(row

*

columns)

+

column]

=

newValue

}

}

}Matrix提供了一個兩個入?yún)⒌臉?gòu)造方法,入?yún)⒎謩e是rows和columns,創(chuàng)建了一個足夠容納rows*columns個數(shù)的Double類型數(shù)組。為了存儲,將數(shù)組的大小和數(shù)組每個元素初始值0.0,都傳入數(shù)組的構(gòu)造方法中來創(chuàng)建一個正確大小的新數(shù)組。關(guān)于數(shù)組的構(gòu)造方法和析構(gòu)方法請參考創(chuàng)建并且構(gòu)造一個數(shù)組。你可以通過傳入合適的row和column的數(shù)量來構(gòu)造一個新的Matrix實例:var

matrix

=

Matrix(rows:

2,

columns:

2)上例中創(chuàng)建了一個新的兩行兩列的Matrix實例。在閱讀順序從左上到右下的Matrix實例中的數(shù)組實例grid是矩陣二維數(shù)組的扁平化存儲://

示意圖grid

=

[0.0,

0.0,

0.0,

0.0]

col0

col1

row0

[0.0,

0.0,

row1

0.0,

0.0]將值賦給帶有row和column下標腳本的matrix實例表達式可以完成賦值操作,下標腳本入?yún)⑹褂枚禾柗指頼atrix[0,

1]

=

1.5matrix[1,

0]

=

3.2上面兩條語句分別讓matrix的右上值為1.5,坐下值為3.2:[0.0,

1.5,

3.2,

0.0]Matrix下標腳本的getter和setter中同時調(diào)用了下標腳本入?yún)⒌膔ow和column是否有效的判斷。為了方便進行斷言,Matrix包含了一個名為indexIsValid的成員方法,用來確認入?yún)⒌膔ow或column值是否會造成數(shù)組越界

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論