方法其實就是函式,只不過它被定義在了類中。在swift中,根據被使用的方式不同,方法分為了例項方法和型別方法兩種。這兩種方法的定義也和objective-c是不同的。本節依次講解這兩種方法。
例項方法被定義在類中,但是由類的例項呼叫。所以,這類方法被稱為例項方法。例項方法和函式一樣,分為了不帶引數和帶引數兩種。以下依次講解這兩種方法的使用。
1.不帶引數的例項方法
不帶引數的例項方法定義和函式的是一樣的,其語法形式如下:
但它的呼叫形式和函式的有所不同,其呼叫形式如下:
其中,物件名必須代表的是方法所屬類的例項。
【示例8-13】以下將使用方法輸出字串"hello"。**如下:
執行結果如下所示:
2.具有引數的例項方法
具有引數的例項方法就是在方法名後面的括號中新增了引數列表。它的定義也和函式一樣,定義形式如下:
它的呼叫形式如下:
下面依次講解分別具有乙個引數和具有多個引數例項方法的使用方式。
(1)具有乙個引數的例項方法
具有乙個引數的例項方法是指在引數列表中只有乙個引數以及型別。
【示例8-14】下面定義乙個類counter。其中包含了increment()、incrementby()、reset()方法。**如下:
其中,increment()方法的功能是自動加1,在每呼叫一次此方法時,都會在原來值的基礎上增加1;incrementby()方法是將當前的值和指定的數相加。執行結果如下所示:
(2)具有多個引數的例項方法
當例項方法的引數列表中包含多個引數時,引數和引數之間需要使用「,」逗號分隔。
【示例8-15】以下將實現兩個數和的計算。**如下:
其中,方法add()包含兩個引數amount1和amount2。呼叫的時候,分別賦值為5和10。執行結果如下所示:
注意:1.當方法具有兩個或者兩個以上的引數時,swift預設僅給方法的第乙個引數名稱乙個區域性引數名稱;預設同時給第二個和後續的引數名稱乙個區域性引數名稱和外部引數名稱,其中區域性引數名稱和外部引數名稱的名稱都是一樣的。如果在呼叫時,第二個引數以及後續的引數不使用外部引數名,程式就會出現錯誤。如下,
在此**中,例項方法在呼叫時第二個引數沒有使用外部引數名,導致程式出現如下的錯誤:
2.如果開發者不想為方法的第二個及後續的引數提供外部名稱,可以通過使用「_」 下劃線作為該引數的顯式外部名稱,這樣做將覆蓋預設行為。
【示例8-16】以下將實現兩個數相乘的結果。**如下:
在定義時,第二個引數前加上了「_」下劃線。所以呼叫的時候,第二個引數可以省略外部引數名。執行結果如下所示:
3.對於例項方法的物件,都必須是通過例項去呼叫的,它不可以和函式的呼叫方法一樣去呼叫,如以下的**,此**實現的功能是在類中定義乙個輸出字串的方法,然後去呼叫,**如下:
錯誤資訊如下:
例項方法是被類的某個例項呼叫的方法。開發者還可以定義類自身呼叫的方法,這種方法被稱為型別方法(因為類被認為是一種型別。所以,屬於類的方法,被稱為型別方法)。定義型別方法需要在func關鍵字之前加上關鍵字class,其一般定義形式如下:
在定義好型別方法後,就可以進行呼叫了,其呼叫的一般形式如下:
注意:這裡的方法名為型別方法名。
1.不帶引數列表的型別方法
不帶引數列表的型別方法就是方法名後面的引數列表中沒有引數。以下定義了乙個輸出字串"hello"中字元的型別方法。**如下:
執行結果如下所示:
2.具有引數的型別方法
具有引數的型別方法是具有引數列表方法。隨著引數的不同,可以將具有引數的型別方法分為具有乙個引數的型別方法和具有多個引數的型別方法。以下就是具有乙個引數的型別方法,該方法實現輸出任意字串的字元。**如下:
執行結果如下所示:
具有多個引數的型別方法說明在引數列表中有多個引數以及型別,引數和引數之間要使用「,」逗號分隔。以下就是定義了多個引數的型別方法,此方法實現了字串和字串的連線功能。**如下:
執行結果如下所示:
注意:在使用類方法時需要注意以下3點:
(1)儲存屬性
在乙個型別方法中不可以使用儲存屬性,否則程式就會出現錯誤,如以下的**,此**實現的是輸出字串"hello"。
由於str是儲存屬性,而printhello()是乙個型別方法,在此**中將str用在了printhello()方法中,導致程式出現了以下的錯誤:
(2)類呼叫方法
所有的型別方法必須要使用類去呼叫,而非物件,否則就會出現錯誤,如以下的**:
由於在此**中,方法printhello()是乙個例項方法,但是在呼叫時,使用物件進行了呼叫,導致程式出現了以下錯誤:
(3)外部引數名
和例項方法相同, swift預設給型別方法的第乙個引數名稱乙個區域性引數名稱;預設同時給第二個和後續的引數名稱區域性引數名稱和外部引數名稱。在呼叫時,一定不要忘記外部引數名。
注意:在swift1.2語言中允許在類中使用關鍵字static定義靜態方法和屬性(所謂靜態屬性或方法是指在程式執行時,分配的記憶體會一直存在。直到退出程式,記憶體才會釋放這塊空間)。其中,靜態屬性的定義如下:
或者為靜態方法的定義如下:
以下將使用static關鍵字在類中宣告乙個靜態屬性,其語法形式如下:
執行結果如下所示:
儲存屬性可以理解為變數的一種。所以隨著變數使用地方的不同,可以將變數分為儲存屬性、區域性變數和全域性變數。這三種變數的不同如表8-1所示。
表8-1 三種變數的不同
注意:這裡提到的方法在前面已經講解過了。
【示例8-17】在以下定義了三個型別的變數分別為str、str1、str2,將它們使用在不同的地方。**如下:
在此**中提到的方法會在以一節中講解。執行結果如下所示:
注意:在使用儲存屬性、區域性變數、和全域性變數時一定要注意它們的作用域,所謂作用域就是指這些變數的有效範圍,圖8.5就是以上**中變數的有效範圍。
圖8.5 作用域
如果乙個變數超出了它的有效範圍,程式就會出現錯誤,如以下的**:
在此**中str2是乙個定義在printstring()方法中的區域性變數,所以它的有效範圍就是在此方法中。但是在此方法之外使用會出現錯誤,在此**中將str2又使用在了方法printstr()中。導致程式出現了以下的出現:
在乙個類中,方法中的區域性變數可能和儲存屬性同名,這是,不可以直接使用相同的名稱去訪問儲存屬性,為了解決這一問題,swift引入了乙個self屬性。如以下**,此**的功能是使用self對儲存屬性進行訪問。**如下:
count表示的是區域性變數的值50,self.count表示儲存屬性的值100。執行結果如下所示:
Swift2 0語言教程之閉包
閉包是自包含的函式 塊,可以在 中被傳遞和使用。swift中的閉包與c和objective c中的 塊 blocks 以及其他一些程式語言中的lambda函式比較相似。在本章中所講的函式其實就是特殊的閉包。本節主要講解關於閉包的基本使用。閉包表示式是一種利用簡潔語法構建內聯 內聯類似與c語言中的巨集...
C語言教程之陣列詳解
目錄 陣列是一組相同型別元素的集合。陣列的建立方式 陣列的元素型別 陣列名 常量表示式 eg.int arr 5 char ch 100 vs編譯器中的易錯點 內應為常量表示式 int n 5 int arr n int arr 5 其實c99標準之前是不支援使用變數的,只能是常量!c99中增加了變...
Swift3 0語言教程組合字串
其中,astring用來指定乙個字串。import foundation var a nsstring string hello,print 組合前 a 組合字串 print 組合後 b 執行結果如下 組合前 hello,組合後 hello,world 2 padding tolength with...