窺探Swift之陣列安全索引與陣列切片

2021-09-23 21:56:10 字數 2468 閱讀 5032

在swift中的陣列和字典中下標是非常常見的,陣列可以通過索引下標進行元素的查詢,字典可以通過鍵下標來獲取相應的值。在使用陣列時,乙個常見的致命錯誤就是陣列越界。如果在你的應用程式中陣列越界了,那麼對不起,如果由著程式的性子的話是會崩潰的。為了防止崩潰呢,我們會對集合做一些安全的處理。比如對陣列進行擴充套件,從而對陣列的索引進行安全檢查,保證陣列的index在正常範圍內。在objective-c中也是經常對陣列,字典等做一些處理操作。

今天的部落格的主要內容是先對objective-c中常用集合的安全擴充套件進行介紹,由此在窺探一下swift語言中的處理。並且還會介紹swift中自定義下標,說白了自定義下標其實就是通過下標的形式與特定的下標值來訪問乙個物件。自定義下標在有些場合中是非常實用的。然後下方還會給出陣列切片的概念與實用方式。廢話少說進入今天的主題。

一、安全的索引集合元素

對乙個集合索引進行安全檢查是很有必要的,也是經常實用的,最常見的就是對陣列和字典索引的安全檢查,該部分內容就是模擬這objective-c中的陣列索引的安全檢查來擴充swift的陣列,從而讓你的swift陣列也同樣具備對陣列安全檢查的功能。

1. objective-c中nsarray對索引的安全擴充套件

下方這段**是非常簡單的,它是對objective-c中的nsarray做的擴充套件,該方法位於nsarray相關的延展中。在你的專案中,如果新增了此段延展**,那麼你就可以通過objectatindexsafe:方法對陣列進行安全的索引。有**不難看出在定義該函式引數時,我們將index宣告為nsuinteger,也就是正整數,這就排除了你對下標傳入乙個負數。緊接著又對index的合法性進行驗證,如果index不在陣列有效範圍內,那麼就返回nil。當你查詢的元素不存在時,你返回nil是不會造成程式崩潰的,因為nil的位址是0x0, 這和歸零若引用有些類似。

當然下方只是nsarray安全擴充套件其中乙個方法,還有許多擴充套件的安全方法,比如陣列的增刪改查都可以進行相應的安全擴充套件,擴充套件的方式和思路與下方這段簡單**類似,再次就不花過多的篇幅對其進行介紹了。

- (id)objectatindexsafe:(nsuinteger)index 

return [self objectatindex:index];

}

2.swift中對array的安全擴充套件

(1)主要是對subscript方法進行過載,在過載的subscript方法中,對index的範圍通過三目運算子進行了安全檢查。如果index在0.. element?

return result

}//通過set方法,對陣列相應的索引進行設定

set (values) }}

}在上述延展的實現中,並沒有多少困難的地方。在subs兩個cript函式中,使用的是可變引數,subscript函式引數的個數是兩個以上(包括兩個)。然後就是通過zip()函式以及對zip()函式返回的結果集進行遍歷,從而對多個下標索引進行值的設定。經過上述延展,我們就可以通過多個索引對陣列進行操作了。上述延展的使用方式如下: 

三、陣列切片

陣列切片在oc中也是不存在的,是swift新引入的概念,該部分將會對陣列切片進行討論,研究一下陣列切片的使用方式及其特點。下方先通過乙個小demo來看一下如何生成陣列切片。下方**段先將乙個字串通過map函式轉換成乙個陣列arraytest, 然後我們建立乙個該陣列的切片。下方**段建立了arraytest陣列中的下標3到下標6這個範圍區間中的切片,arrayslices就是陣列切片變數,它是arrayslice型別的,具體**段如下所示。

在陣列切片中有一點需要注意,陣列切片的下標與原始陣列中的下標保持一致。如果要取出切片arrayslices中的第乙個值,我們要使用arrayslices[3], 而不是arrayslices[0], 如果使用arrayslices[0]就會報錯,如下所示:

因為陣列是值型別,儘管切片與原陣列有著對應的陣列下標,但是切片是原始陣列的部分拷貝,所以修改切片或者修改原陣列,兩者互不影響,下方示例給出了該測試,如下所示:

如果把切片轉換成列舉,那麼切片中與原始陣列對應的下標關係將不存在,下方是將切片轉換成列舉序列,然後對其進行遍歷,**如下:

上述**段輸出結果如下:

今天部落格就先寫到這兒,關於陣列的延展還有許多,以後有機會再討論。其實我們還可以通過一些方式來為我們自己的物件新增下標。也就是可以通過下標來訪問物件屬性,這個以後在討論吧。  

窺探Swift之字串(String)

之前總結過objective c中的字串 objective c精選字串處理方法 學習一門新語言怎麼能少的了字串呢。swift中的string和objective c語言中nsstring還是區別不小的,swift中的string又回歸了正常狀態,使用起來更為方便快捷。本篇部落格的主題就是swift...

窺探Swift之基本資料型別

中介紹了如何使用playground來學習swift語言。本篇部落格就使用playground來窺探swift語言。千里之行始於足下,當然了,除非你是坐的高鐵或者飛機。還是那句話從基礎開始吧,本篇部落格主要介紹一下swift的基本資料型別。swift中的資料型別可謂是百花齊放百家爭鳴,下面就來窺探一...

窺探Swift之基本資料型別

中介紹了如何使用playground來學習swift語言。本篇部落格就使用playground來窺探swift語言。千里之行始於足下,當然了,除非你是坐的高鐵或者飛機。還是那句話從基礎開始吧,本篇部落格主要介紹一下swift的基本資料型別。swift中的資料型別可謂是百花齊放百家爭鳴,下面就來窺探一...