[爆卦]c#宣告物件是什麼?優點缺點精華區懶人包

雖然這篇c#宣告物件鄉民發文沒有被收入到精華區:在c#宣告物件這個話題中,我們另外找到其它相關的精選爆讚文章

在 c#宣告物件產品中有3篇Facebook貼文,粉絲數超過8萬的網紅邱顯智,也在其Facebook貼文中提到, 【針對法案據實討論,莫讓「柯」學凌駕理性】 民進黨黨團總召柯建銘先生,昨日發表【司法改革不是少數人鬥爭的工具 在野黨不該成為幫凶】一文,直稱時力版本的陪審制有所錯誤,包括未回答如何解決僵局陪審團(hung jury)、最低本刑三年以上就適用陪審制是世界獨創、僵局陪審團的狀況將會使被告無罪釋放、引...

 同時也有18部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,德明資科APP開發課程第6次上課 想要將大量的文字項目加到手機中, 可以用ListView(清單項目), 使用的關鍵就在除了: 1宣告物件、2連結元件、3建立事件之外, 還多了陣列連接器(ArrayAdapter)的使用,只要把資料放在字串資源檔中, 再連接就可以了,記得也要設置外觀,如此便可輕鬆...

  • c#宣告物件 在 邱顯智 Facebook 的精選貼文

    2020-07-23 12:16:15
    有 1,494 人按讚

    【針對法案據實討論,莫讓「柯」學凌駕理性】
     
    民進黨黨團總召柯建銘先生,昨日發表【司法改革不是少數人鬥爭的工具 在野黨不該成為幫凶】一文,直稱時力版本的陪審制有所錯誤,包括未回答如何解決僵局陪審團(hung jury)、最低本刑三年以上就適用陪審制是世界獨創、僵局陪審團的狀況將會使被告無罪釋放、引入訴因制度故以傷害罪起訴後,縱使發現有殺人故意,亦必須判處被告無罪云云。
     
    柯總召的言論令人相當詫異。除了欠缺基本法律概念,曲解陪審法制之外,更讓人覺得,柯建銘對於自己在2015年領銜提案之「國民參與刑事審判法草案」(內容採取陪審團評議之陪審制),非常不熟悉。
     
    為了避免讓大家對陪審制產生根本誤解,即使法案過了,我們還是要一一駁斥柯建銘的謬誤。未來,我們也會開啟 #柯學小教室 系列,即時回應柯總召各種似是而非的怪談。
     
    1⃣ 如何解決僵局陪審團(Hung Jury)?
     
    所謂的僵局陪審團,指的是陪審團無法依據陪審法的規定達成決議。而所謂的無法達成決議,除了「達成有罪的決議」之外,也包括「達成無罪的決議」。這時候的處理方式,時代力量的法條草案規定得很清楚了: 
     
    「(第一項)陪審團無法依前條規定作成評決者,應由陪審團主席報告審判長,由審判長裁定命陪審團續行討論或宣告陪審團無法達成評決。(第二項)審判長宣告陪審團無法達成評決者,應於公開法庭為之,並即時裁定解任全體陪審員。(第三項)檢察官於前項宣告後三十日內,得以書面聲請重新踐行陪審員選任程序,更新審判程序。(第四項)檢察官未依前項規定提出聲請者,視為撤回起訴。」
     
    換句話說,該次無法達成評決的陪審團,會被全體解任,並由檢察官在三十日內,聲請再次重新選任陪審員。
     
    這個部分和柯總召2015年的提案第57條,幾乎完全一致(除了第一項的「陪審團無法依前條規定」或「陪審團無法依前條『第一項』規定」的些微差異)。因為重新選任陪審團,就是典型陪審制處理Hung Jury的方式。
     
    另外補充一下,陪審團不是一聽審完就投票,而是會在評議室裡面,互相討論、辯證,最後達成共識。在這個階段中,多數要拿出理由說服少數,少數也會指出疑點,促使多數思考見解是否妥當。
     
    如同尤伯祥律師所言:人民參與審判有助於民主深化,因為人民在審判的過程裡會學到兩件事情,第一件事情是少數雖然要服從多數,但是多數要尊重少數,在那個評議的過程裡,由於要採取重度多數決或是一致決,所以少數的聲音一定會被聽到,如果不能夠說服少數,可能這個一致決或重度多數決就不能夠形成。也就是因為這樣,所以審議式民主的精神能夠透過人民參與審判慢慢的深化到民主生活裡,#這樣我們的民主不會淪為多數暴力。
     
    👉解任舊陪審團,由檢察官聲請再次選任陪審團
     
    2⃣ 最低本刑三年以上有期徒刑就適用陪審制,是世界獨創?
     
    這句來自平行時空的說法非常幽默。
     
    首先,美國只要最重本刑逾六個月以上有期徒性的犯罪,被告就有選擇陪審團審判的憲法上權利。
     
    其次,今日之柯別忘了昨日之柯,柯總召2015年的提案,同樣是以最低本刑三年以上有期徒刑(也就是刑事訴訟法第31條所規定的強制辯護案件)作為標準。
     
    👉 美國最重本刑六個月以上就可以用,柯總召的草案也是三年以上
     
    3⃣ 僵局陪審團的狀況將會使被告無罪釋放?
     
    首先,如前所述,沒有辦法一致決,除了沒有辦法一致的有罪,也包括沒有辦法一致的無罪。只要一個陪審員認為有罪,那就不會直接無罪釋放。
     
    其次,Hung Jury的法律效果並沒有當然撤銷羈押,因為這個案件還是會繼續審理,除非檢察官不願意繼續告,沒有在30天內重新聲請踐行陪審員選任程序,導致視為撤回起訴。
     
    👉 僵局陪審團不等於無罪,更不會立即釋放
     
    4⃣ 引入訴因制度故以傷害罪起訴後,縱使發現有殺人故意,亦必須判處被告無罪
     
    第一,刑法第277條第1項的傷害罪,法定刑是五年以下有期徒刑、拘役或五十萬元以下罰金,根本不是「最輕本刑三年以上有期徒刑」之罪,不會適用陪審制。
     
    第二,讓我們引用一下時代力量修正動議第43條第4項到第7項的規定:「(第4項)第一項起訴書,應記載下列事項:一、被告之姓名、性別、出生年月日、身分證明文件編號、住所或居所或其他足資辨別之特徵。二、犯罪事實。三、所犯法條。(第5項)前項第二款之犯罪事實,以載明日、時、處所及方法特定之,並不得引用足使陪審員產生預斷之虞之書類或其他物件之內容。(第6項)第四項第三款所犯法條得同時記載罪名。法條記載錯誤,如無害於被告防禦權之行使者,不影響起訴之效力。(第7項)檢察官得就其主張構成犯罪之特定事實或所犯法條,為預備或擇一記載,但以基礎事實共通且無害於被告防禦權之行使為限。」
     
    依據草案,檢察官可以就其主張構成犯罪之特定事實或所犯法條,為預備或擇一記載。覺得有可能審理結果歪向不同犯罪?請做好預備之記載。
     
    另外,再和柯總召法普一下。就算是傳統的刑事訴訟案件,也不是法官想變更法條就可以變更法條,還必須要在與起訴的犯罪事實具有同一性的範圍內,才可以變更。因此,「檢察官先進行預備或擇一之記載」和「法官嗣後變更起訴法條」,差異其實並沒有想像中那麼大。
     
    最後,或許有人會疑惑,如果被起訴殺人,結果最後認定是傷害,那被告會被無罪釋放嗎?這涉及一個刑法的ABC。殺人和傷害的犯意,都是對人身生命、身體法益的侵害,只是犯意高低的問題,還是可以構成傷害罪。縱使是在美國,依據聯邦刑事規則的規定,第31條(c)、(1)的規定:“ (c) Lesser Offense or Attempt. A defendant may be found guilty of any of the following: (1) an offense necessarily included in the offense charged”,因為傷害的犯意必然包括於殺人的犯意之中,被告還是會被判較輕的傷害罪。
     
    或許柯總召會疑惑:那如果發現完全不一樣的犯罪事實或法條的話怎麼辦?這個部分現行實務上其實不少見,處理方式也很簡單,那就是不在檢察官起訴的範圍內,法院也依據不告不理原則,不得審理。但這不代表被告沒事了。檢察官可以隨時啟動偵查程序,並再為起訴的處分。
     
    👉 檢察官得就其主張構成犯罪之特定事實或所犯法條,為預備或擇一之記載
    👉被告仍會構成輕罪,不會無罪
     
    最後,我要呼籲柯總召,如果要討論法律,務必依據法案內容據實討論,不要讓政治凌駕理性。
     
    更重要的是,在提出法案以前,更要先理解自己提出的法案內容。而不是單純為反對而反對(為反對觀審制而支持陪審制),才是負責任的立法委員,應該有的態度。
     
    #柯學小教室
      
     
    (圖片來源:柯建銘臉書)

  • c#宣告物件 在 Taipei Ethereum Meetup Facebook 的精選貼文

    2020-03-24 23:33:18
    有 8 人按讚

    📜 [專欄新文章] 類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做
    ✍️ 田少谷 Shao
    📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium

    有鑒於個人近期關注的 Uniswap 及 Curve 皆用 Vyper 實作,索性瀏覽了官方文件並嘗試一些開發工具,希望此文能減少一些讀者初嘗 Vyper 會遇到的麻煩!

    Vyper and Solidity

    Outline

    一. Vyper 極簡介二. 與 Solidity 語法差異三. 開發、開發環境設置 1. 語法高亮 2. 本地 Vyper compiler 安裝 3. 使用 Truffle 操作 ERC20 - 安裝 Truffle - 發幣 - 寫個簡易賣幣合約四. 已知 Remix 問題 五. 結語

    一. Vyper 極簡介

    Vyper 是除 Solidity 外,以太坊上的另一智能合約 (Smart contract) 語言。其語法和 Python 相近,但畢竟也是寫合約的語言,邏輯差異不大,所以若熟悉 Solidity 應該不難理解用 Vyper 寫出的合約!

    Vyper 主要被設計和 Solidity 的區別是安全性及可讀性,這部分會在下一段落及後方的實作中舉例說明。

    二. 與 Solidity 語法差異

    Vyper 與 Solidity 的差異有許多,在本段只就個人認為感受較深的三點進行說明,其他差異只進行翻譯,有興趣的讀者可以到官方文件詳細了解:https://vyper.readthedocs.io/en/latest/index.html

    1. 沒有 modifier

    Solidity 常見的 onlyOwner() modifier; 由於 gist 沒有 Solidity 的語法高亮,故截圖

    在 Vyper 中單純用 assert 及 assert_modifiable 來進行條件檢查,兩者差別為若要檢查函數執行後的返還值,要用後者,如下圖:

    Vyper 寫法

    2. 沒有 Class inheritance 繼承

    繼承是物件導向程式設計 (OOP) 的核心概念,但各種繼承關係有時候確實很複雜。Vyper 沒有繼承,這無疑大幅地增加了程式可讀性及安全性,以及降低審計程式碼的難度。在此提供一個例子供不熟悉 OOP 複雜之處的讀者有個概念:

    source: https://consensys.github.io/smart-contract-best-practices/recommendations/#multiple-inheritance-caution

    在上例中,contract A 的 fee 值 (因繼承自 contract B 和 C,故有 fee 一值) 是 5、a 值也是 5 (因繼承自 contract Final,故有 a 一值)。原因是 A 先繼承 B 再繼承 C,因此 contract A 中的 setFee() 是使用了 contract C 的 setFee(),而 a 值是由於 C(5),這代表 contract C 的 constructor (舊版本中即 function C(),函式名稱同 contract 名稱) 被傳入的值為 5。

    稍微延伸一下以上概念,將 contract A 改成:contract A is C, B。如此一來,a 值還有 fee 值都會是 3,因為這次 A 先繼承 C 再繼承 B,因此最終吃到的值是 contract B 的。

    以上就是 OOP 繼承的複雜之處的簡單範例說明,應該能稍微感受到爲什麼除去繼承後會大幅提高可讀性及安全性,畢竟即使是熟悉 OOP 的人有時頭腦一混亂也會開始懷疑自己寫的程式碼繼承結構是否正確 …

    3. 沒有 dynamic array 動態陣列

    這應該是目前 Vyper 設計中爭議最大的部分。沒有動態陣列代表在宣告陣列時需要宣告其長度,也就是說 Solidity 中的寫法 uint[], bool[] 等等,這些是不會出現在 Vyper 的。在 Vyper 中只能出現諸如:

    # Vyper 的變數宣告方式為 變數名稱: 存取範圍(變數型態(若為陣列給長度))

    values: uint256[10]participants: public(address[20])

    可以看到上方的 uint256 及 address 兩陣列皆需要宣告長度,不能不宣告而使其動態地配置空間。

    沒有動態陣列固然可以確保執行運算的範圍、次數,但一來動態陣列真的很方便、二來在 Solidity 有此功能而 Vyper 卻沒有的情況下可能會造成麻煩,詳見此一討論串:點我。

    4. 沒有 inline assembly,程式碼中不會有組合語言

    5. 沒有 function overloading,函式不會因傳入的參數數目不同而結果不同

    6. 沒有 operator overloading,運算符號不會有不同於預設的自定義功能

    7. 沒有無限迴圈,可免於 gas limit attack

    8. 十進位定點數 decimal fixed point 而非二進位 (binary) 定點數,詳見:點我

    三. 開發、開發環境設置

    結論先講

    開發 Vyper 的最佳姿勢目前個人認為是在本地裝上 Vyper compiler、用 Truffle 部署,並在撰寫時將檔名後加上 .py 就能有 Python 的語法高亮👌

    1. 語法高亮 (syntax highlighting)

    有語法高亮絕對是舒服地寫程式的第一步。

    Remix 有 Vyper 的語法高亮,但一來個人目前不推薦使用 Remix 來撰寫 Vyper,原因詳見下方 4. 已知 Remix 問題;二來 Remix 的語法高亮其實也沒有很清楚,因此個人推薦:在本地開發,將檔名後加上 .py 就會有 Python 的語法高亮。

    2. 本地 Vyper compiler 安裝

    照官方說明使用 Python 的虛擬環境 virtualenv:

    source: https://vyper.readthedocs.io/en/latest/installing-vyper.html#installing-vyper

    簡單兩點提醒:

    如果中間那行報錯但確實已經有 Python,則可能是版本問題。依照自己電腦上的版本改成相應的即可,ex: python3.6 改成 python3

    進入虛擬環境後(檔案路徑前方應有 vyper-venv 的提示),使用此指令: vyper {檔案名稱}.vy,即可編譯 .vy 檔;使用完畢後輸入 deactivate 即可退出

    3. 使用 Truffle 操作 ERC20

    安裝 Truffle

    Truffle 雖有冗餘的 migration 但也別無他法,畢竟 Remix 目前仍不完善 :(

    下載流程可以照官方文件,使用 vyper-example:

    source: https://github.com/truffle-box/vyper-example-box

    由於我們會接上測試網 Ropsten,因此還要下載 truffle-hdwallet-provider:

    source: https://github.com/trufflesuite/truffle-hdwallet-provider

    接者就可以開始使用 Vyper 寫合約了!

    發幣

    由於 Vyper 的官方文件中已經有許多優質範例,因此本文希望來點不一樣但大家卻又很熟悉的…以 ERC20 為例(這千篇一律的主題xD):

    用 Curve 的 ERC20 程式碼為範本,發一個幣(又要發…)

    寫一個簡易賣幣合約

    選擇這個主題一方面畢竟 ERC20 是以太坊的最大宗應用之一,二來有興趣的讀者可以透過讀 ERC20 的程式碼來熟悉 Vyper,並在看過本文的流程後對於用 Vyper+Truffle 來操作 ERC20 有完整的概念!

    好的,首先複製一份 Curve 的 ERC20 程式碼(看到就順手拿來用),並複製到 Truffle 所在路徑的 contracts 資料夾中:https://github.com/curvefi/curve-contract/blob/pool_compound/vyper/ERC20.vy

    由於第一點希望著重在跑一次流程,因此不改動合約的程式碼。

    ERC20.vy 複製到 contracts 資料夾中後,到 migrations 資料夾開啟 2_deploy_contracts.js,首先將 require() 中的參數改為 ERC20.vy 的檔名 ERC20,再來依照自己喜好決定幣的名稱、代號、小數點位數及發行總量,輸入於 deployer.deploy() 中。

    接著,為了和測試網 Ropsten 互動,需要將以下程式碼寫入 truffle-config.js。

    第二行的 privateKeys 是帳號的私鑰。以下實作需要兩個帳號來操作,因此請從錢包匯入兩組私鑰(並非助憶詞)。

    在第 13 行中 HDWalletProvider 此函式的第三個參數代表要用第幾個帳號最為預設帳號(部署合約等),第四個函數代表總共匯入幾組帳號。而第二個參數則是需要至 Infura 申請一個 project 來得到串接 Ropsten 的連結。這兩步驟並非本文重點,因此不詳細解說步驟,Google 搜尋關鍵字應該就會找到方法!

    接著,就可以輸入以下指令來將代幣發佈到 Ropsten:

    truffle deploy --network ropsten

    有進入虛擬環境才可以編譯 .vy 檔,若忘記就會收到如下的錯誤訊息:

    記得打開虛擬環境才能編譯 .vy 檔

    成功後就可以在 contract address 中看到代幣發佈的位置,加入到 Metamask 中就可以看到。本文的例子是維尼代幣 Winnie the Coin, WTC ;)

    contract address 便是 ERC20 的所在

    Winnie the Coin, WTC

    好了,到此測試網上又多了一個測試用的垃圾廢幣。

    寫個簡易賣幣合約

    賣幣合約中我想要簡單有兩個功能就好:付錢買幣 、結束銷售,以下就是程式碼。買幣的部分就不寫太詳細,固定價格為 0.01 Ether 可以買 500 代幣。

    簡單說明幾點:

    Solidity 的 constructor() 在 Vyper 中為 Python 風的 __init__():

    函式的屬性(public, private, payable 等等)放在函式上方,與 Python 的修飾器位置相同

    總之寫法跟 Python 很像,次方也一樣是用兩次乘法代表:**

    變數前加上 self 代表是當前合約的變數/全域變數,因此非常容易與函式中的變數/區域變數做區隔

    由於已經在第一行匯入了 ERC20 那份合約,因此透過將地址傳入合約當參數,就可以呼叫在該地址的合約:ERC20(self.tokenAddress) 。並且,可以將部署的合約存成一個變數 erc20 較方便

    寫完合約後一樣要更改 migrations 資料夾中的 2_deploy_contracts.js 如下,將代幣所在的地址作為參數輸入。

    由於先前已經部署過一次了,因此要重置才能再部署第二次,輸入以下指令:

    truffle deploy --reset --network ropsten

    部署成功之後就要來試著買幣啦!輸入以下來進入 console:

    truffle console --network ropsten

    成功進入後應該會看到 truffle(ropsten)> 的字樣。接著,首先取得部署的兩合約,並查看是否有返回合約資訊:

    # ERC20 及 SellToken 是先前在 2_deploy_contracts.js 中的變數名稱,代表被部署的合約

    let instance1 = await ERC20.deployed()instance1 # 印出 instance1 的資訊

    let instance2 = await SellToken.deployed()instance2 # 印出 instance2 的資訊

    再來,為了讓 SellToken 可以賣幣,要先用 ERC20 的合約匯幣到 SellToken 的合約。因此,輸入以下指令:

    instance1.transfer(instance2.address, 10000)

    # 這裡數字只要設為 > 500 就可以

    接著,我們要利用第二個帳號去買幣(第一個帳號為預設帳號,因此就是代幣擁有者)。將帳號的資訊存入變數 accounts 中,再指定送出交易的帳號是第二個帳號。由於我個人匯入私鑰的順序是將第一個帳號存在 truffle-config.js 的 privateKeys[0]、第二個帳號存在 privateKeys[1],因此第二個帳號的地址就會在 accounts[1] 的位置:

    let accounts = await web3.eth.getAccounts()

    instance2.buyToken({from: accounts[1], value: 10000000000000000})

    # value 為 10^16 是因為在 SellToken 的 buyToken 函式中買一次要 0.01 Ether, 即為 10^16 wei

    然後應該就會在自己的第二個帳號中看到匯入的幣了~

    最後,由於合約中結束銷售就是一個自殺 selfdestruct 函式,因此可以呼叫看看,第一個帳戶錢包中的錢應該會增加,因為第二個帳戶有付款買幣;並且,可以到 Ropsten 上瀏覽,應該能看到相關提示:

    中間 contract 的右上角有 Self Destruct 的樣式

    四. 已知 Remix 問題

    Remix 目前有兩個版本,只有新版有 Vyper 的編譯器。在此整理目前遇到的問題,如果有人也遇到可以對照一下本處,可以省去很多自我懷疑xD

    不會報錯

    Remix 的編譯結果有時會是錯的、和本地端編譯出來的結果不同

    舉上方的 SellToken 合約為例,將其複製到 Remix 中使用左邊的 Remote Compiler 有錯,但又不報錯 q_q (ERC20 的合約有在同檔案目錄)

    左方有紅色三角形,代表編譯失敗,但沒有報錯訊息可以看…

    getter function 竟然要花錢

    用 Solidity 寫的合約,查詢 public 變數的值應該是不用消耗 gas 的,但不知何故查詢 Vyper 寫的合約的 public 變數卻要消耗 gas,如下圖…

    可以看到中下方有 22026 gas 的消耗

    Local compiler 無法使用

    圖中的 Local Compiler 此選項,個人雖照官方文件執行 vyper-serve 但卻失敗,因此若有讀者成功希望能留個言不吝分享!

    五. 結語

    Vyper 作為一個比 Solidity 更新的合約語言,在寫程式碼的方面沒什麼問題,但相關的開發工具、學習資源等都遠不及 Solidity。

    Vyper 主打的兩個特色:可讀性的部分相信看完上面的讀者應該已經有些感覺;安全性…小白如作者我倒是沒有感受到顯著的不同。況且 Solidity 已經發展許久,很多錯誤的寫法、知名的安全漏洞大家應該也很熟悉了,還有 Openzeppelin 提供安全合約寫法的範本,因此有待以後高人解說安全性是否真的是 Vyper 較好。

    有興趣者可以查看 Vyper 的安全報告:點我,大意是目前 Vyper 的編譯器仍有許多問題待改進! (感謝 Chih-Cheng Liang 的提供)

    本文對 Vyper 的介紹及其與 Solidity 的差異只講了個大概,欲知更詳細的介紹還是要麻煩讀者前往官方文件了:https://vyper.readthedocs.io/en/latest/index.html

    最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)

    田少谷 Shao - Medium

    類 Python 的合約語言 Vyper 開發入門:與 Solidity 差異、用 Truffle 部署、ERC20 賣幣合約實做 was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.

    👏 歡迎轉載分享鼓掌

  • c#宣告物件 在 紀老師程式教學網 Facebook 的最佳貼文

    2012-05-22 18:31:50
    有 11 人按讚

    [iOS Programming] 什麼是 Key-Value Coding?

    剛剛收到班上同學的來信,說他在網路上看到一個名詞,叫 Key-Value Coding。問我什麼是 Key-Value Coding。由於這個主題比較冷僻,用到的機會也不能算多。在只有 48 小時得把所有 iOS SDK 教完的壓力下,這個主題被我捨棄了。沒想到同學們還是很用功啊!看來我不講是不行的了(所以說,出來混,一定要還的...)。

    先做個定義吧:「Key-Value Coding 就是一種可以用『字串』,來存取物件內某個『屬性欄位』的技巧」。

    假設你有一個類別叫做「People」,裡面有兩個屬性欄位「name」與「addr」定義如下:

    @interface People : NSObject

    {
    NSString *name;
    NSString *addr;
    }
    @property NSString *name;
    @property NSString *addr;

    @end

    然後你用 People 宣告了一個名為 robert 的物件,並指定初值給它。如下所示:
    People *robert = [[People alloc] init];
    robert.name = @"Robert";
    robert.addr = @"台北市忠孝東路 1 號";

    若你要存取「name」與「addr」屬性,你得這麼寫:
    NSLog(@"%@", robert.name); // 印出 robert 物件 name 屬性內容 --> "Robert"
    NSLog(@"%@", robert.addr); // 印出 robert 物件 addr 屬性內容 --> "台北市忠孝東路..."

    使用 Key-Value Coding,你可以這麼存取屬性值:
    NSLog(@"%@", [robert valueForKey:@"name"]); // 存取到 robert 內的 name 欄位。

    你有沒有注意到,欄位名稱「name」被字串化了!也就是說,只要你把 "name" 改為 "addr",抓到的欄位值就是 robert.addr 的了。

    這有什麼好處呢?舉例來說,你製作了一個資料庫 App,有個下拉式清單,列出所有可以讓使用者選擇的欄位名稱。如「姓名」、「住址」...。使用者只要選擇了一個欄位,如:住址,就可以印出當前物件內,住址那一欄。如果你先把「姓名」與對應的欄位名稱「name」、以及「住址」與對應的欄位名稱「addr」…以「鍵值對(Key-Value Pair)」的方式存放好:

    Key Value
    ------------
    姓名 name
    住址 addr
    ...

    在 Objective-C 內,鍵值對是用 NSDictionary 類別存放的:
    NSArray *keys = [[NSArray alloc] initWithObjects: @"姓名", @"住址", …nil];
    NSArray *values = [[NSArray alloc] initWithObjects: @"name", @"addr", … nil];
    NSDictionary *dic = [[NSDictionary alloc] initWithObjecs:values forKeys:keys];

    則 Key 可以拿去當下拉式功能表要顯示的內容。當使用者選擇了其中一項,如:「姓名」,我就可以拿回到「鍵值對」的物件,查到它對應的值是「"name"」。接著,我就可以用所謂的「Key-Value Coding」這招,抓出當前物件姓名欄位的值:
    NSLog(@"%@", [robert valueForKey: theValue]); // theValue 代表由「鍵值對」中查到的值「"name"」。

    若使用者選擇的是「住址」,則 theValue 會被填入「"addr"」,上述程式碼不用改一個字,照常抓出 robert 物件內住址欄位的值。

    您看出「Key-Value Coding」的價值了嗎?萬一 People 類別內有上百個欄位,我要印出特定欄位的值,都是用下列這一道就解決了:
    NSLog(@"%@", [robert valueForKey:@"name"]);

    不用 Key-Value Coding、把物件的屬性欄位「字串化」的話,想存取特定欄位,你一定得寫一堆 if ~ else:
    if (選中的欄位 == 「姓名」)
    fieldToBePrinted = robert.name;
    else if (選中的欄位 == 「住址」)
    fieldToBePrinted = robert.addr;
    else


    這樣,大家知道 Objective-C 內的 Key-Value Coding 是什麼意思了嗎?

你可能也想看看

搜尋相關網站