發表文章

目前顯示的是 2月, 2013的文章

無參數名稱之方法

命名方法時,參數是否需要名稱,其實可以選擇。 例如: -(int) set : (int) n    : (int) d ; 上方並非兩個參數名稱,範例中只有『 set :: 』一個方法,其中冒號表示此方法有兩個參數。 那該如何呼叫『set ::』方法: [ aFraction set :1 : 3 ]; 省略參數名稱並不是很好的方法,本篇只是提出這樣的合法語法供參考。 省略參數名稱可能造成閱讀程式困難。

具有多參數的方法

如果要同時設定分子分母的方法名稱應該為 setNumerator : andDenominator : 只要在定義方法時在每一個參數後面加上『:』表示將接受冒號之後的參數。 用法如下: [ myFraction setNumerator : 1 andDenominator : 3 ]; 這樣的命名雖然不錯,但名稱太長,我們可以改短增加其可讀性: [ myFraction setTo : 1 over : 3 ];  兩種方式都可以,可依個人喜好命名! 好的方法名稱對於程式的可讀性非常重要喔! 範例: (介面檔宣告 setTo:over 方法) 於介面檔 Fraction.h  #import <Foundation/Foundation.h> @interface Fraction : NSObject @property int numerator, denominator; -( void ) print; -( void ) setTo: ( int ) n  over: ( int ) d; -( double )  convertToNum;  @end (加入新增 setTo:over: 方法的定義於實作檔) 於實作檔 Fraction.m #import "Fraction.h" @implementation Fraction @synthesize numerator, denominator; -( void ) print {      NSLog ( @"%i/%i" , numerator , denominator ); } -( double ) convertToNum {      if ( denominator != 0 )          return ( double ) numerator / denominator ;      else          return NAN ; } -( void ) setTo:( int )n over:( int )d {      numerator = n;

以點運算子存取屬性 instance.property

以點運算子存取屬性 Objc 允許使用更簡便的語法來存取實體變數。 若要取得 myFraction 物件的 numerator 的值,可寫成: [ myFraction numerator ] 此敘述將 numerrator 訊息傳給 myFraction 物件,之後回傳 numerator 的值。 在Objc 裡也可以用點運算子來表示: myFraction.numerator 一般格式為: instance.property 也可以用相似的語法設定物件的值: instance.property = value  或這樣表示: [instance setProperty: value] 例如設定分子分母: [ myFraction setNumerator : 1 ]; [ myFraction setDenominatpr : 3 ]; 同樣的我們也可以改成點敘述表示:  myFraction.numerator = 1; myFraction.denominator = 3; 之後則會使用合成 ( synthesize ) 方法的新特徵以存取實體變數。 值得一提的是,也可以使用點運算子於方法。此外,若有一個 getter 方法稱為 numerator ,你仍然可以在程式中撰寫如 myFraction.numerator 的運算式,即使 numerator 尚未被定義為property。 注意: 基於前面的討論,雖然撰寫 myFraction.print 敘述在與法中是對的,但不是好的程式設計風格。點運算子與實體變數結合使用時,就是用來設定/擷取實體變數。而點運算子與方法合用時,在 Apple 的文件稱之為任務 ( Task )。Task 通常不會利用點運算子來執行,而較喜歡以傳統的括號訊息表示式。 注意: 若您合成存方法,請不要將實體變數名稱至於 new、alloc、copy 或 init 的前面。 這些必須假設編譯器會將相對應的方法加以合成。

合成存取方法 @synthesize

範例程式 #import "Fraction.h" @implementation Fraction {      int numerator;      int denominator; } -( void ) print {      NSLog ( @"%i/%i" , numerator , denominator ); } -( void ) setNumerator:( int )n     // setter方法 {      numerator = n; } -( void ) setDenominator:( int )d {      denominator = d; } -( int ) numerator     // getter 方法 {      return numerator ; } -( int ) denominator {      return denominator ; } -( double ) convertToNum {      if ( denominator != 0 )          return ( double ) numerator / denominator ;      else          return NAN ; } @end 合成存取方法 在 Objc 2.0,您可以讓 setter 和 getter 這兩個方法自動產生。  ( 一般稱之為 存取方法 ( accessor method )  )  現在才提及這個,是因為自己能寫出這些方法對於程式設計師是非常重要的。 既然 Objc 2.0 提供這樣方便的功能,那我們就要好好善用這項優點。 首先先介紹 @property 指令識別屬性(properies)。這些屬性通常是實體變數。 例如,在Fraction 類別裡,實體變數 numerator 與 denominator 就屬於這類。 以下介面區段新增了@property指令:

C 語言特性 :陣列

圖片
何為陣列 Objc 透過陣列的資料結構,讓我們能夠定義  具有排序的資料項目 。 本篇重點:定義陣列,並加以運用。 定義一變數,以表示陣列的集合。這一變數不僅是代表一個變數,透過索引 ( index )、下標 ( subscript ) 引用陣列中的每一個元素。若要存取 x 陣列 索引為 i 的元素 ,如下: x [ i ] 運算式 grades [ 3 ] 可以將陣列中的個別原素指定為變數 g = grades [ i ];  陣列範例  grades [ 0 ] grades [ 1 ] grades [ 2 ] grades [ 3 ] 第一個元素 第二個元素 第三個元素 第個元素 第一個元素為 grades [ 0 ]  與其他變數一樣使用前,必須先先宣告。宣告陣列中的元素資料形態,像是 int、float 或是物件,最後再補上陣列元素的個數。 fraction * fract [100];       // 物件 下 標  ( subscript ) 索引 ( index ) 陣列的初始化 定義變數時,可以直接指定數值。相同的,陣列也可以直接指定初始值。 int  integers [ 5 ]  = { 0, 1, 2 , 3, 4 }; 將初始值寫入在『 { } 』之間,並且每一個元素以『 , 』隔開。 同樣的,字元陣列的初始值也是以相同的方式呈現 int  letters [ 5 ] = {   ' a ' ,  ' b ' ,   ' c ' ,  ' d ' ,   ' e ' }; 將 'a'、 'b'、 'c'、 'd'、 'e' 指定給 letters 陣列中的前五項元素。 但我們並不需要初始化全部的元素值,若只初始化一個元素值,則其他元素將被初始化為 0,方法如下。 float data [ 5 ] = {  20.0, 34.0, 40.5 }; 前三個元素分別為:20.0、 34.0、

【觀念】基本常用資料型態: int, float, double,char, id

圖片
常用的資料型態 int  型 態 在objective-C中整數常數,可能由一個或多個數字組成。若前方加上" - "負號,表示該常數為負數。即便如此複數也算是整數,所以 -12 、 0 、1234 都屬於合法的整數常數。但其實也有限制,須注意數字間是否含有空白鍵,或是任何的符號,這都被視為不合法的變數。如 1,000 為不合法的常數需改為 1000。 若要使用 NSLog 輸出常數值則需使用格式化字元 %i float  型 態 float 可儲存包含小數點的數值,常數中通常包含了一個小數點,如 3. (小數點後可不含數字)、12.8 、 -0.001 都算是合法的浮點數常數。另一種浮點數值的表現法為 科學記號表示法 (scientific notation)   例如:12.3 × 106 其科學表示法為 12.3e6。 若要使用 NSLog 輸出常數值則需使用格式化字元 %f 、%e、%g double 型態 double形態與float形態相同,只是 double 表示的數值大約是 float 的兩倍大。 char 型態 char 型態儲存單一字原變數。字元常數以 ( '  ' ) 單引號寫入。所以 ' a ' 、 ' 0 ' 、 ' [ ' 都算是合法的的字員常數。 若要使用 NSLog 輸出常數值則需使用格式化字元 %c id 型態 id 資料形態主要用來儲存任何型態的物件。某種程度上稱之為泛型( generie ) 的物件形態。 id 是一個非常重要的資料形態。 筆者目前對其還未有太多的瞭解,所以就先介紹到此。 常用基本資料型態 Jinsiyoo: 當然還有一些修飾詞來延伸變數範圍,之後用到會再詳加介紹。

[Mac使用祕技]如何在分類Dock欄?

圖片
展示範例: 第一步驟: 終端機路徑:Applications  >  Utilities  >  Terminal 第二步驟: 輸入指令 (1): defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}' 點擊Return鍵 輸入指令 (2): killall Dock  點擊Return鍵 此時Dock會重新啓動,之後就能看到多了一個透明欄 圖示 點住拖拉透明欄位就可以分類Dock上的軟體圖示。 備註: 每重複一次第二步驟即可多一個透明欄位。 輸入過的指令可以在 Terminal,點擊 ⇡ 方向鍵來喚回前幾次輸入的指令。 想取消透明欄位只要往外拖甩即可。

【觀念】命名變數

變數名稱的命名其實非常簡單! 僅需要遵守兩項規則: 起始字必須為英文字母 或是底線 "_" 之後使用字母或是數字皆可為合法的名稱: sum i pageView myPage lookForPage CoolMan 怎樣會是不合法的名稱呢? sun$value  ($是不合法字元) page view  (變數中間不能使用空白鍵) 4meeting  (起始字不可以是數字) int  (此為Objective-C內建的保留字) 請記得分辨大小寫差別。sum、Sum、SUM 在ObjC中被判定是三種不同的變數。 所以請務必檢查命名大小寫的差異。 然而撰寫程式有一些潛規則在: AddressBook  (起始字大寫可能是類別名稱) currentEntry  (起始字小寫可能是物件名稱) addNewBook  (起始為動詞可能是方法名稱) 另外也有程式設計師會用底線"_"將兩個名詞隔開以方便閱讀 current_entry 這也是合法的變數命名。 最重要的是... 變數命名最好與所要表達的事項名稱相關 一方面可以增加程式的閱讀性 另一方面在除錯與撰寫程式上都能較容易判斷程式的功用。

【解決問題】[[Class alloc] init]

在函式中定義一個名為 myFraction 的變數如下 (1.) 此行的敘述表示 myFraction 是 Fraction 形態的物件 簡單說就是 myFraction 用來儲存 Fraction 類別的值 下一步我們則會像(2.)把記憶體配置給物件使用 然而通過 alloc 方法配置給記憶體並不代表物件已經初始化 為了能夠讓物件正常使用,則必須加以初始化(3.) Fraction *myFraction;  myFraction = [Fraction alloc];  myFraction = [myFraction init] 但今天輸出時發現 Output會顯示很多奇怪的東西 欲輸出值也沒有出現 這時Xcode回饋給我以下這樣的訊息: Thread 1: signal SIGABRT 我查了論壇,發現了解決的方法 原來在iOS 5以前還允許使用剛剛的語法 後來則必須簡化成底下這種寫法: Fraction * myFraction; myFraction = [ [Fraction alloc] init] ; 將配置和初始化寫在同一行 改寫以後程式就能正常的輸出囉! 當然還有更簡潔的寫法 就連定義物件參數也一起整合: Fraction * myFraction = [[Fraction alloc]init]; 你以為這樣就是最精簡了嗎? 還有更精簡的新方法new,透過new可以取代 alloc和 init 這兩種方法 以達到配置記憶體與初始化的目的: Fraction *myFraction = [Fraction new ];