Professional Documents
Culture Documents
ﻛﺘﺎب ﻣﻦ ﺗﺄﻟﻴﻒ
Bert Altenburg
Alex Clarke
Philippe Mougin
II
اﶈﺘﻮﻳﺎت
III
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
IV
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﻘﺪﻣﺔ
اﳌﻘﺪﻣﺔ
ﺗﻘﺪم ﻟﻚ ﺗﻜﻨﻮﻟﻮﺟﻴﺎ أﭘﻞ Appleﻛﺎﻓﺔ اﻷدوات اﻟﻼزﻣﺔ ﻹﻧﺸﺎء
ﺗﻄﺒﻴﻘﺎت Cocoaﻣﺠﺎﻧ َﺎ .ﻓﻬﺬﻩ اﻷدوات ﺗﺄﺗﻴﻚ ﻣﺠﺘﻤﻌﺔ ﲢﺖ ﻣﻈﻠﺔ
Xcodeاﻟﺘﻲ ﺗﻮﺟﺪ ﺑﻨﻈﺎم Mac OS Xﻛﻤﺎ اﻧﻬﺎ ﻗﺎﺑﻠﺔ ﻟﻠﺘﺤﻤﻴﻞ ﻣﻦ
ﻗﺴﻢ اﳌﻄﻮرﻳﻦ ﲟﻮﻗﻊ أﭘﻞ اﻷﻟﻜﺘﺮوﻧﻲ.
ﻳﻮﺟﺪ ﻋﺪد ﻣﻦ اﻟﻜﺘﺐ اﳉﻴﺪة ﺣﻮل ﺑﺮﻣﺠﺔ اﳌﺎﻛﻨﺘﻮش ،وﻟﻜﻨﻬﺎ
ﺗﻔﺘﺮض وﺟﻮد ﺧﺒﺮة ﺑﺮﻣﺠﻴﻪ ﻟﺪى اﻟﻘﺎرئ .ﻫﺬا اﻟﻜﺘﺎب ﻟﻦ ﻳﻔﺘﺮض
ذﻟﻚ .وﺳﻴﻌﻠﻤﻚ أﺳﺎﺳﻴﺎت اﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ Objective-Cﻣﺴﺘﺨﺪﻣ َﺎ
ﺑﺮﻧﺎﻣﺞ .Xcode
ﺑﻌﺪ ﻗﺮأﺗﻚ ﻟﻌﺪد ﻣﻦ ﻓﺼﻮل اﻟﻜﺘﺎب ﺳﺘﺘﻤﻜﻦ ﻣﻦ إﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ
ﺑﺴﻴﻂ ﻻ ﻳﻌﺘﻤﺪ اﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﻪ Graphical -
User Interfaceواﳌﻌﺮوﻓﺔ ﺑﺎﺧﺘﺼﺎرﻫﺎ اﻟﺸﺎﺋﻊ . GUIوﺑﻌﺪ ذﻟﻚ
ﺑﻌﺪد ﻣﻦ اﻟﻔﺼﻮل ﺳﺘﺘﻌﻠﻢ إﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﺑﺴﻴﻂ ﻣﻦ ﺧﻼل واﺟﻬﺔ
اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﻪ ) .(GUIوﺑﻌﺪ اﻧﺘﻬﺎﺋﻚ ﻣﻦ ﻗﺮاءة ﻫﺬا اﻟﻜﺘﺎب
ﺳﺘﻜﻮن ﺟﺎﻫﺰاَ ﳌﺎ ﺗﻘﺪﻣﺔ ﻟﻚ اﻟﻜﺘﺐ اﳌﺘﻘﺪﻣﺔ ﳌﺎ ورد ﺑﻌﺎﻟﻴﻪ .ﻋﻠﻴﻚ
ﺑﺘﻔﺤﺼﻬﺎ وﻗﺮاءﺗﻬﺎ ﺣﻴﺚ ﻳﻮﺟﺪ اﻟﻜﺜﻴﺮ ﻟﺘﺘﻌﻠﻤﻪ .ﺣﺎﻟﻴ ًﺎ ﻻ داﻋﻲ
ﻟﻠﻘﻠﻖ ﻓﻬﺬا اﻟﻜﺘﺎب ﻳﻨﺘﻬﺞ أﺳﻠﻮب اﻟﺘﻘﺪﱘ اﻟﺴﻬﻞ ﻟﻠﻤﻌﻠﻮﻣﺎت.
١
اﳌﻘﺪﻣﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﻟﺸﻔﺮة ﺳﻨﻘﻮم ﺑﺎﻹﺷﺎرة إﻟﻰ ﺳﻄﺮ ﻣﻌﲔ ﻛﻤﺎ ﻳﻠﻲ: ﻛﻴﻒ ﺗﺴﺘﺨﺪم ﻫﺬا اﻟﻜﺘﺎب
]volume = baseArea * height // [4.3
ﻛﻤﺎ ﺳﺘﺮى ،ﺳﻨﺴﺘﻌﺮض ﺑﻌﺾ اﻟﻨﺼﻮص اﻟﺘﻲ ﲤﺜﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ
Code snippestاﻟﺘﻲ ﺳﻴﻘﻮم اﳌﺎﻛﻨﺘﻮش ﺑﺘﻘﻴﻴﻤﻬﺎ وﺗﻨﻔﻴﺬ ﻣﺤﺘﻮاﻫﺎ
ﻓﻲ اﳊﻘﻴﻘﺔ إن ﻋﻤﻠﻴﺔ اﻟﺒﺮﻣﺠﺔ ﻟﻴﺴﺖ ﺑﺎﻷﻣﺮ اﻟﻴﺴﻴﺮ .ﻓﻬﻲ ﺗﺘﻄﻠﺐ وﺳﺘﻜﻮن داﺧﻞ ﺻﻨﺎدﻳﻖ ﻣﺜﻞ ﻫﺬا:
ﻣﻨﻚ اﳊﻀﻮر اﻟﻮاﻋﻲ واﻟﺘﺠﺮﻳﺐ اﻟﺘﻄﺒﻴﻘﻲ ﻟﻜﺎﻓﺔ اﳌﻌﻠﻮﻣﺎت اﻟﺘﻲ Some tidbits
ﻳﻘﺪﻣﻬﺎ ﻫﺬا اﻟﻜﺘﺎب .ﻟﻦ ﺗﺴﺘﻄﻴﻊ اﻟﻌﺰف ﻋﻠﻰ اﻟﺒﻴﺎﻧﻮ أو ﻗﻴﺎدة وﻧﻘﺘﺮح ﻋﻠﻴﻚ أن ﺗﻘﺮأ اﻟﻔﺼﻞ اﻟﻮاﺣﺪ ﻣﺮﺗﺎن ﻋﻠﻰ اﻷﻗﻞ ﻣﻊ ﲡﺎﻫﻞ
اﻟﺴﻴﺎرة ﻣﻦ ﺧﻼل ﻗﺮاءة اﻟﻜﺘﺐ .اﻷﻣﺮ ذاﺗﻪ ﻳﻨﻄﺒﻖ ﻣﻊ اﻟﺒﺮﻣﺠﺔ. ﺻﻨﺎدﻳﻖ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻓﻲ اﻟﺒﺪاﻳﺔ .ﺛﻢ أﺛﻨﺎء ﻗﺮاءﺗﻚ اﻟﺜﺎﻧﻴﺔ
ﻫﺬا اﻟﻜﺘﺎب ُﻣﻘﺪم ﻟﻚ ﺑﻬﻴﺌﺘﺔ اﻹﻟﻜﺘﺮوﻧﻴﺔ ﻟﺘﻤﻜﻴﻨﻚ ﻣﻦ اﻻﻧﺘﻘﺎل ﻟﻠﻔﺼﻞ إﻗﺮاء ﻫﺬﻩ اﻟﺼﻨﺎدﻳﻖ ،ﺣﻴﺚ ﺳﺘﻜﻮن ﻋﻨﺪﻫﺎ ﻣﺘﺄﻫﺒ َﺎ ﻹﻋﺎدة
ﻣﻨﻪ إﻟﻰ ﺑﺮﻧﺎﻣﺞ Xcodeواﻟﻌﻮدة دون أﻳﺔ ﻋﻮاﺋﻖ .ﻟﺬا ﻣﺎ أن ﺗﺒﺪأ ﻣﻊ ﺗﺬﻛﺮ وﺗﻄﺒﻴﻖ ﻣﺎ ﺗﻌﻠﻤﺘﻪ ﻓﻐﺎﻟﺒ َﺎ ﻣﺎ ﺗﻜﻮن ﻫﺬﻩ اﻟﻨﺼﻮص ﻣﺸﺘﺘﺔ
اﻟﻔﺼﻞ اﳋﺎﻣﺲ ﻧﻘﺘﺮح ﻋﻠﻴﻚ اﳌﺮور ﺑﻜﻞ ﻓﺼﻞ ﺛﻼث ﻣﺮات ﻋﻠﻰ ﻻﻧﺘﺒﺎﻫﻚ ﺑﺎﳌﺮات اﻷوﻟﻰ .إن اﻋﺘﻤﺎد ﻫﺬﻩ اﻟﻄﺮﻳﻘﺔ ﻓﻲ ﺗﻌﻠﻢ ﻣﺒﺎدئ
اﻷﻗﻞ .ﻓﻲ اﳌﺮات اﻟﻼﺣﻘﺔ ﺣﺎول ﺗﻄﺒﻴﻖ اﻷﻣﺜﻠﺔ اﻟﻮاردة وﻻ ﻣﺎﻧﻊ ﻣﻦ ﺟﺪﻳﺪة ﻳﻌﻴﻨﻚ ﻣﻦ ﺗﺜﺒﻴﺖ اﳌﻌﻠﻮﻣﺔ.
أن ﲡﺮي ﺗﻌﺪﻳﻼﺗﻚ ﻋﻠﻰ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﺣﺘﻰ ﲡﺮب ﻛﻴﻔﻴﺔ ﺳﻴﺮ ﻫﺬﻩ اﻟﻜﺘﺎب ﻳﺤﺘﻮي ﻋﺪة أﻣﺜﻠﺔ ﻣﻜﻮﻧﺔ ﻣﻦ ﺳﻄﺮ أو اﺛﻨﲔ ﻣﻦ
اﻷﻣﻮر. اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ .وﻗﺪ اﺳﺘﺨﺪﻣﻨﺎ اﻷﻗﻮاس اﻟﺘﺎﻟﻴﺔ] [4ﻟﻌﻤﻞ ارﺗﺒﺎط
ﻟﻠﻤﻌﻠﻮﻣﺔ ﻣﻊ ﻣﺜﺎﻟﻬﺎ اﳌﻘﺎﺑﻞ .إن ﻏﺎﻟﺒﻴﺔ اﻷﻣﺜﻠﺔ ﻣﻜﻮﻧﺔ ﻣﻦ ﺳﻄﺮﻳﻦ
ﻼ ﻣﻦ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ .وﻓﻲ أﺣﻴﺎن ﻣﻌﻴﻨﺔ ﺳﻴﺘﻀﻤﻦ أو اﻛﺜﺮ ﻗﻠﻴ ً
اﳌﺜﺎل رﻗﻢ وﻳﺘﺒﻌﻪ رﻗﻢ آﺧﺮ ﺑﻌﺪ اﻟﻔﺎﺻﻠﺔ ﺣﻴﺚ ﻧﺴﺘﺨﺪم اﻟﺮﻗﻢ اﻵﺧﺮ
ﻟﻺﺷﺎرة إﻟﻰ رﻗﻢ ﺳﻄﺮ ﻣﻌﲔ ﻣﻦ ﻛﺘﻠﺔ ﺷﻔﺮة اﻟﺒﺮﻣﺠﺔ .ﻛﻤﺜﺎل اﻟﻘﻮس
] [3.4ﻳﺸﻴﺮ إﻟﻰ اﻟﺴﻄﺮ ٣ﻣﻦ اﳌﺜﺎل . ٤وﻓﻲ اﻻﻗﺘﺒﺎﺳﺎت اﻟﻄﻮﻳﻠﺔ ﻣﻦ
٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻗﺒﻞ أن ﻧﺒﺪأ
ﻗﺒﻞ أن ﻧﺒﺪأ
ﻟﻘﺪ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ ﻫﺬا اﻟﻜﺘﺎب وﻛﻨﺖ ﻋﺰﻳﺰي اﻟﻘﺎريء ﻣﺤﻮر اﻫﺘﻤﺎﻣﻨﺎ.
ﻓﺒﻤﺎ أﻧﻪ ﻣﺠﺎﻧﻲ ،أﺳﻤﺢ ﻟﻨﺎ ﺑﺘﺴﻮﻳﻖ اﳌﺎﻛﻨﺘﻮش ﻛﺄﻓﻀﻞ ﻧﻈﺎم ﺗﺸﻐﻴﻞ
ﺑﻘﻠﻴﻞ ﻣﻦ اﳉﻬﺪ .وإﻟﻴﻚ اﻟﻄﺮﻳﻘﺔ:
ﺳﻬﻠﺖ .١ﻛﻠﻤﺎ ﺻﻘﻠﺖ ﺧﺒﺮات ﺗﻌﺎﻣﻠﻚ ﻣﻊ اﳌﺎﻛﻨﺘﻮش ﻛﻠﻤﺎ ّ
ﻟﻠﻤﺤﻴﻄﲔ ﺑﻚ أن ﻳﺘﻨﺒﻬﻮا ﻹﻣﻜﺎﻧﻴﺎت ﻫﺬا اﻟﻨﻈﺎم .ﻟﺬا ﻛﻦ ﻣﻄﻠﻌ َﺎ
ﻋﻠﻰ آﺧﺮ اﻷﺧﺒﺎر ﺑﺰﻳﺎرﺗﻚ ﻟﻠﻤﻮاﻗﻊ واﳌﻨﺘﺪﻳﺎت وﻗﺮاءﺗﻚ ﻟﻠﻤﺠﻼت
اﻟﺘﻲ ﺗﻬﺘﻢ ﺑﺎﳌﺎﻛﻨﺘﻮش .ﻣﻦ اﳌﺆﻛﺪ أن ﺗﻌﻠﻤﻚ ﻟﻠﻐﺔ Objective-C
أو إﺗﻘﺎﻧﻚ ﻟـ AppleScriptﺳﻴﻜﻮن ﻟﻬﻤﺎ اﺛﺮﻫﻤﺎ اﻟﻔﺎﻋﻞ ﻓﻲ اﻷﻋﻤﺎل
اﻟﺘﻲ ﺗﺆدﻳﻬﺎ.
إن اﺳﺘﺨﺪام AppleScriptﻳﻐﻨﻴﻚ ﻋﻦ ﺳﺎﻋﺎت ﻣﻦ اﻷﻋﻤﺎل اﳌﺘﻜﺮرة
واﳌﻀﻨﻴﺔ .أﻟﻘﻲ ﻧﻈﺮة ﻋﻠﻰ ﻛﺘﺎﺑﻨﺎ اﳌﺠﺎﻧﻲ ﺣﻮل AppleScript
واﳌﻮﺟﻪ ﻟﻠﻤﺒﺘﺪﺋﲔ وﻫﻮ ﻣﺘﻮﻓﺮ ﻋﻠﻰ http://www.macscripter.
. net/books
.٢اﻇﻬﺮﻟﻠﻌﺎﻟﻢﻛﺎﻓﺔأناﳊﺎﺳﺒﺎتﻟﻴﺴﺖﻓﻘﻂ”"وﻧﺪوز .“Windows
إن ﻟﺒﺲ ﻣﻼﺑﺲ ﻋﻠﻴﻬﺎ ﺷﻌﺎرات ﻣﺎﻛﻨﺘﻮش ﻟﻠﻌﻠﻦ ﻫﻮ أﺣﺪ اﻟﻄﺮق،
وﻟﻜﻦ ﻫﻨﺎك ﻃﺮق اﻛﺜﺮ ﻟﺘﻌﺰﻳﺰ ﻫﺬا اﻟﻨﻈﺎم وﻫﻲ ﺗﺒﺪأ ﻣﻦ داﺧﻞ ﺑﻴﺘﻚ.
٣
ﻗﺒﻞ أن ﻧﺒﺪأ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻣﺴﺘﺨﺪﻣﻲ اﳌﺎﻛﻨﺘﻮش واﻟﺬي ﺳﻴﻜﻮن ﻟﻚ دور ﻣﻬﻢ ﻓﻲ رﻓﻊ ﻧﺴﺒﺔ ﻓﺈذا ﻣﺎ ﺷﻐﻠﺖ ﻣﺮاﻗﺐ اﻟﻨﺸﺎﻃﺎت Activity Monitorاﳌﻮﺟﻮد ﲟﺠﻠﺪ
ﻣﺸﺎرﻛﺘﻬﻢ .ﻋﻨﺪﻫﺎ ﺳﻴﺪرك ﻣﺴﺘﺨﺪﻣﻲ اﻷﻧﻈﻤﺔ اﻷﺧﺮى ﻛﻴﻒ ﻫﻮ اﻷدوات Utilitiesاﳌﺘﻮاﺟﺪ داﺧﻞ ﻣﺠﻠﺪ اﻟﺘﻄﺒﻴﻘﺎت Applications
أداء اﳌﺎﻛﻨﺘﻮش. ﺳﺘﻠﺤﻆ ﻣﺪى ﻧﺪرة اﺳﺘﺨﺪام اﻟﻨﻈﺎم ﻟﻜﺎﻓﺔ ﻗﻮاﻩ اﳊﺴﺎﺑﻴﺔ اﻟﻘﺼﻮى.
ﻳﻮﺟﺪ ﻫﻨﺎك ﺑﺮاﻣﺞ ﻋﻤﻼء ﺑﻌﺪﻳﺔ ﺗﻐﻄﻲ ﻣﻮاﺿﻴﻊ ﻣﺘﻨﻮﻋﺔ ﻛﺎﳊﺴﺎب، ﻳﻘﻮم اﻟﻌﻠﻤﺎء ﺑﺘﻄﻮﻳﺮ ﻋﺪة ﻣﺸﺎرﻳﻊ ﺣﻮﺳﺒﺔ ذات ﲢﻜﻢ ﺑﻌﺪي
واﻟﻌﻼﺟﺎت اﻟﺴﺮﻳﺮﻳﻪ واﳌﺰﻳﺪ .ﺣﺘﻰ ﺗﺨﺘﺎر اﳌﺸﺮوع اﳌﻨﺎﺳﺐ ﺗﻔﺤﺺ ) distributed computing (DCﻛﻤﺸﺮوع Folding@homeأو
ﻫﺬا اﳌﻮﻗﻊ http://distributedcomputing.info/projects.html ﻣﺸﺮوع SETI@homeاﻟﺬي ﻳﺴﺘﻘﻲ ﺟﺰء ﺑﺴﻴﻂ ﻻ ﻳﺬﻛﺮ ﻣﻦ ﻣﻮارد
وﻗﺪ ﺗﻮﺟﺪ ﻣﺸﻜﻠﺔ ﺑﺴﻴﻄﺔ ﺣﻮل ﻫﺬا اﻻﻗﺘﺮاح :ﻫﺬﻩ اﳌﺸﺎرﻛﺔ اﻟﻌﻤﻠﻴﺎت وﻫﻲ ﻣﺸﺎرﻳﻊ ذات أﻫﺪاف ﺳﺎﻣﻴﺔ .ﺣﻴﺚ ﳝﻜﻨﻚ ﲢﻤﻴﻞ
ﺳﺘﺘﺤﻮل إﻟﻰ ﻧﻮع ﻣﻦ اﻹدﻣﺎن! أﺣﺪ ﺗﻠﻚ اﻟﺒﺮاﻣﺞ اﳌﺠﺎﻧﻴﺔ وﻫﻲ ﺗﺪﻋﻰ ﻋﻤﻴﻞ DC clientودﻋﻬﺎ
ﺗﻨﺠﺰ اﻋﻤﺎك اﳊﺴﺎب اﳌﻄﻠﻮﺑﺔ ﻣﻨﻬﺎ .اﻧﻬﺎ ﺗ ّﻔﻌﻞ ذاﺗﻬﺎ ﺿﻤﻦ اﻟﻨﻈﺎم
.٣ﺗﺄﻛﺪ ﻣﻦ ﺣﺼﻮل ﺟﻬﺎزك ﻋﻠﻰ أﻓﻀﻞ اﻟﺒﺮﻣﺠﻴﺎت .وﻻ ﺗﻌﺘﻤﺪ
ﺑﺄدﻧﻰ ﻗﺪر ﻣﻦ ﻃﺎﻗﺔ اﳌﻌﺎﳉﺔ اﳌﺘﺎﺣﺔ.
ﻓﻲ ذﻟﻚ ﻋﻠﻰ ﻣﺎ ﺗﻄﻮرﻩ ﻣﻦ ﺑﺮﻣﺠﻴﺎت ﺑﻨﻔﺴﻚ .واﺟﻌﻠﻬﺎ ﻋﺎدة
ﻣﻦ ﻋﺎداﺗﻚ اﻟﺪاﺋﻤﺔ أن ﺗﺰود ﻣﻄﻮري اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺴﺘﺨﺪﻣﻬﺎ ﻣﺎ أن ﺗﺴﺘﺨﺪم أﺣﺪ ﺑﺮاﻣﺠﻚ اﻻﻋﺘﻴﺎدﻳﺔ ﻋﻠﻰ ﺟﻬﺎزك ﺳﻴﺘﻄﻠﺐ
ﲟﺮﺋﻴﺎﺗﻚ .ﺣﺘﻰ ﻓﻲ ﺣﺎل ﲡﺮﻳﺒﻚ ﻻﺣﺪ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﻟﻢ ﺗﻌﺠﺐ اﻷﺧﻴﺮ اﻻﻧﺘﺒﺎﻩ اﻷﻗﺼﻰ ﻣﻦ اﳌﻮارد ،ﻋﻨﺪﻫﺎ ﻳﺘﻨﺤﻰ ﺑﺮﻧﺎﻣﺞ اﻟﻌﻤﻴﻞ
ﺑﻬﺎ ،ﻓﻘﻂ أﺧﺒﺮ اﳌﻄﻮر ﺑﺎﻟﺴﺒﺐ .اﻋﻠﻦ ﻋﻦ ﻣﺸﻜﻼت اﻟﺒﺮﻧﺎﻣﺞ ﺣﺘﻰ أﻧﻚ ﻟﻦ ﺗﺸﻌﺮ ﺑﻪ وﻫﻮ ﻓﻲ اﳊﺪود اﻟﺪﻧﻴﺎ ﻣﻦ ﻧﻄﺎق اﻟﻨﻈﺎم.
bugsﻣﻦ ﺧﻼل اﻟﺘﻮﺛﻴﻖ اﻟﺪﻗﻴﻖ ﻟﻸواﻣﺮ اﻟﺘﻲ ُﻗﻤﺖ ﺑﻬﺎ أو اﶈﺘﻤﻠﺔ ﻛﻴﻒ ﻟﻬﺬﻩ اﳌﺸﺎرﻛﺔ أن ﺗﺴﺎﻋﺪ ﻣﻦ وﺿﻊ اﻟﺘﻮﻋﻴﺔ ﺑﺎﳌﺎﻛﻨﺘﻮش؟
ﻟﻈﻬﻮر ﺗﻠﻚ اﳌﺸﻜﻠﺔ. ﻓﻲ اﳊﻘﻴﻘﺔ ﻛﺜﻴﺮ ﻣﻦ ﺑﺮاﻣﺞ ﻣﺸﺎرﻳﻊ اﻟﻌﻤﻴﻞ DC clientﻫﺬﻩ ﺗﻘﻮم
.٤ادﻓﻊ ﻗﻴﻤﺔ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺴﺘﺨﺪﻣﻬﺎ .وﻟﺘﻌﻠﻢ اﻧﻪ ﻃﺎﳌﺎ ﻛﺎن ﺑﺘﻘﻴﻴﺪ ﻧﺘﺎﺋﺞ ﻣﻌﻄﻴﺎﺗﻬﺎ ﻓﻲ ﻣﻮاﻗﻊ أﻟﻜﺘﺮوﻧﻴﺔ ﺣﻮل اﻟﻮﺣﺪات اﻟﺘﻲ
ﻫﻨﺎك ﻃﻠﺒﺎت ﺷﺮاء ﻟﺴﻮق ﺑﺮاﻣﺞ اﳌﺎﻛﻨﺘﻮش ﻓﺎﻟﻔﺮﺻﺔ ﻛﺒﻴﺮة ﻟﻈﻬﻮر ﰎ اﺣﺘﺴﺎﺑﻬﺎ .ﻣﺎ أن ﺗﻨﻀﻢ ﻟﻔﺮﻳﻖ اﳌﺎﻛﻨﺘﻮش )واﻟﺬﻳﻦ ﺳﺘﺘﻌﺮف
ﻣﻄﻮرﻳﻦ وﺑﺮاﻣﺞ ﻗ ّﻴﻤﺔ. ﻋﻠﻰ أﺳﻤﺎﺋﻬﻢ ﻣﻦ ﺧﻼل اﻟﻨﺘﺎﺋﺞ اﳌﻌﺮوﺿﺔ( ﻋﻨﺪﻫﺎ ﺳﺘﺠﺪ ﻧﺴﺒﺔ
٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻗﺒﻞ أن ﻧﺒﺪأ
واﻻن أﺛﻨﺎء ﻗﻴﺎﻣﻚ ﺑﺘﺤﻤﻴﻞ أﺣﺪ ﺗﻠﻚ اﻟﺒﺮاﻣﺞ اﻟ ُﺒﻌﺪﻳﺔ ،دﻋﻨﺎ ﻧﺒﺪأ
اﻟﻌﻤﻞ!
٥
ﻗﺒﻞ أن ﻧﺒﺪأ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ
٧
اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﻟﺘﻌﻠﻴﻤﺔ ﺗﻠﻚ إﻟﻰ إﻳﻌﺎزات و أواﻣﺮ ﻣﻜﻮﻧﺔ ﻣﻦ ﻧﺒﻀﺎت اﻟﺼﻔﺮ ﻛﺎﻧﺖ ﺗﻠﻚ ﻫﻲ اﻟﺼﻴﺤﺔ اﻟﺴﺎﺋﺪة ﺑﺘﻠﻚ اﻟﻔﺘﺮة .وﻗﺪ ﺗﺘﺴﺎءل ﻋﻦ
واﻟﻮاﺣﺪ ﺣﻴﺚ ﻳﺴﺘﻄﻴﻊ اﳊﺎﺳﺐ ﻋﻨﺪﻫﺎ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻪ. أﺣﻮال أوﻟﺌﻚ اﻟﺬﻳﻦ ﻓﻘﺪوا اﻫﺘﻤﺎﻣﻬﻢ ﻟﺘﻘﺪﱘ اﳊﻠﻮل ﺑﺴﺒﺐ ﺗﻐﻴﻴﺮ
إن ﻗﺮاءة واﺳﺘﻴﻌﺎب اﻟﻨﺼﻮص اﳌﻜﺘﻮﺑﺔ ﻣﻦ ﻗﺒﻞ اﻟﺒﺸﺮ ﻣﻬﻤﺔ ﺻﻌﺒﺔ ﻃﻔﻴﻒ ﻓﻲ اﻟﺘﺴﻤﻴﺔ ”"اﳌﺘﻐﻴﺮات .“Variables
ﻟﻠﻤﺮﻛﻢ ،ﻟﺬا ﻳﻨﺒﻐﻲ ﻋﻄﺎءﻩ ﺗﻠﻤﻴﺤﺎت ﺧﺎﺻﺔ ،ﻛﺘﻠﻤﻴﺤﺔ إﻧﺘﻬﺎء ﺳﻄﺮ =٢+٦س
اﳌﻌﻠﻮﻣﺔ ﻣﻦ اﻻواﻣﺮ واﻟﺒﻴﺎﻧﺎت ﻣﺜ َ
ﻼ ﺣﻴﺚ وﺿﻌﻨﺎ اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ. ص=٤*٣
ان ﻣﺠﺮد اﻏﻔﺎل ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ واﺣﺪة ﻻﺣﺪ اﺳﻄﺮ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ، إن ﻟﻐﺔ Objective-Cﺗﺴﺘﺨﺪم اﳌﺘﻐﻴﺮات ﻛﺬﻟﻚ .ﻓﺎﳌﺘﻐﻴﺮات ﻣﺎ
اﳌﺠﻤﻊ ،ذﻟﻚ اﻧﻪ ﺳﻴﻔﺸﻞ ﻓﻲ ﲢﻮﻳﻞ ﺗﻠﻚ ﻳﺴﺒﺐ ﻓﺸﻞ ﻓﻲ ﻣﻬﻤﺔ ّ ﻼ.ﻫﻲ إﻻ أﺳﻤﺎء ﺗﺸﻴﺮ ﳉﺰﺋﻴﺎت ﻣﻌﻴﻨﺔ ﻣﻦ اﻟﺒﻴﺎﻧﺎت ،ﻛﺎﻷﻋﺪاد ﻣﺜ َ
اﻟﺘﻌﻠﻴﻤﺎت اﻟﻰ اواﻣﺮ ﳝﻜﻦ ﻟﻠﻤﺎﻛﻨﺘﻮش ان ﻳﻔﺴﺮﻫﺎ وﻳﻨﻔﺬﻫﺎ .ﻻ ﺗﺪع ﻫﻨﺎ ﻟﺪﻳﻨﺎ ﻣﺜﺎل ] [1ﻳ ّﻌﺪ ﻛﺘﺼﺮﻳﺢ ﻹﻳﻌﺎز Objective-Cﺣﻴﺚ
اﳌﺠﻤﻊ ﺳﻴﺸﻜﻮ ﻣﻦ ﻋﺪم ﲤﻜﻨﻪ ﻣﻦ ﻫﺬا اﻻﻣﺮ ﻳﻘﻠﻘﻚ ﻛﺜﻴﺮاَ ،ذﻟﻚ ان ّ أوﺟﺪﻧﺎ ﻣﺘﻐﻴﺮاً اﻋﻄﻴﻨﺎﻩ اﺳﻤ َﺎ واﺳﻨﺪﻧﺎ ﻟﻪ ﻗﻴﻤﺔ ﻋﺪدﻳﺔ ﻣﻦ ﺧﻼل
اﲤﺎم ﻋﻤﻠﻴﺔ اﻟﺘﻔﺴﻴﺮ .ﻛﻤﺎ ﺳﻨﺮى ﻓﻲ اﻟﺘﻔﺼﻮل اﻟﻘﺎدﻣﺔ ،اﻧﻪ ﻳﻘﺪم ﻟﻚ ﺳﻄﺮ ﺑﺮﻣﺠﻲ.
اﻟﻌﻮن ﻟﻠﺒﺤﺚ ﻋﻦ اﻻﺧﻄﺎء اﶈﺘﻤﻠﺔ ﺑﲔ ﺳﻄﻮر ﺷﻔﺮة اﻟﺘﻌﻠﻴﻤﺎت. ][1
;x = 4
ﺑﺎﻟﺮﻏﻢ ﻣﻦ ان اﺳﻤﺎء اﳌﺘﻐﻴﺮات ﻟﻴﺴﺖ ذات ﻣﻌﻨﻰ ﻗ ّﻴﻢ ﻟﻠﻤﺮﻛﻢ،
اﻻ ان اﺳﻤﺎء اﳌﺘﻐﻴﺮات اﻟﻮاﺿﺤﺔ ﲡﻌﻞ ﻣﻦ ﻗﺮاءﺗﻚ ﻟﻠﺒﺮﻧﺎﻣﺞ اﻳﺴﺮ إن اﳌﺘﻐﻴﺮ xﻳﺤﺘﻮي ﻗﻴﻤﺔ ﻋﺪدﻳﺔ ﺗﺴﺎوي .٤وﺳﺘﻼﺣﻆ وﺟﻮد
ﻟﻠﻔﻬﻢ .ان ﻫﺬﻩ اﳋﺎﺻﻴﺔ ﻣﻬﻤﺔ ﺟﺪاَ ﻋﻨﺪ ﺗﻘﺼﻴﻚ ﻋﻦ اﻻﺧﻄﺎء ﻓﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ ";" ﻓﻲ ﻧﻬﺎﻳﺔ اﻹﻳﻌﺎز .ذﻟﻚ أن اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ
اﻟﺒﺮﻣﺠﻴﺔ داﺧﻞ ﺳﻄﻮر اﻟﺸﻔﺮة. ﻣﻄﻠﺐ أﺳﺎﺳﻲ ﻋﻨﺪ ﻧﻬﺎﻳﺔ ﻛﻞ إﻳﻌﺎز .ﳌﺎذا؟
ٌﻳﻄﻠﻖ ﻋﻠﻰ اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ ﺗﻌﺎرﻓ َﺎ ﻣﺼﻄﻠﺢ .Bugﺑﻴﻨﻤﺎ ﺗﻘﺼﻲ ﻗﺪ ﻳﺒﺪو اﳌﺜﺎل ﻏﻴﺮ ذي أﻫﻤﻴﺔ ،ﻋﻠﻰ ﻛﻞ ﺣﺎل اﳊﺎﺳﺒﺎت إﺟﻤﺎﻻ
واﺻﻼح ﺗﻠﻚ اﻻﺧﻄﺎء ﻳﻄﻠﻖ ﻋﻠﻴﻪ .debuggingﻟﺬا ،ﻣﺘﻰ ﻣﺎ ﻻ ﺗﺪرك ﻣﺎ ﻋﻠﻴﻬﺎ أن ﺗﻔﻌﻠﻪ ﺑﻬﺬا اﻟﺴﻄﺮ .ﻟﺬا ﻳﻮﺟﺪ ﺑﺮﻧﺎﻣﺞ ﺧﺎص
ﺗﻌﺎﻣﻠﺖ ﻣﻊ اﻟﺸﻔﺮة ﲡﻨﺐ اﺳﺘﺨﺪام ﺗﻠﻚ اﳌﺴﻤﻴﺎت اﻟﻐﻴﺮ واﺿﺤﺔ اﳌﺠﻤﻊ ” compilerوﻫﻮ ﺿﺮوري ﻟﺘﺤﻮﻳﻞ ﻧﺺ ﻳﻄﻠﻖ ﻋﻠﻴﻪ اﺳﻢ ”" ّ
٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ
ﺑﺸﻜﻞ ﻛﺒﻴﺮ ﻓﻴﻤﺎ ﻳﺘﻌﻠﻖ ﲟﺴﺄﻟﺔ ﺣﺴﺎﺳﻴﺔ اﳊﺮوف. أو اﻟﺘﻲ ﻻ ﻣﻌﻨﻰ ﻟﻬﺎ ﻣﺜﻞ اﺳﺘﺨﺪام ﻣﺘﻐﻴﺮ .xﻣﺜﻼ ﻋﻨﺪ اﳊﺎﺟﺔ
اﻟﺮﺟﺎء ﻣﻼﺣﻈﺔ ﺗﺴﻤﻴﺔ اﳌﺘﻐﻴﺮات ﺑﻜﻠﻤﺎت ﻣﺘﻮاﺻﻠﺔﺗﻜﻮنﻓﻲاﻟﻨﻬﺎﻳﺔ ﻟﻮﺟﻮد ﻣﺘﻐﻴﺮ ﻣﻬﻤﺘﻪ ﺣﻔﻆ ﻗﻴﻤﺔ ﻋﺮض ﺻﻮرة ﻣﺎ ،ﺣﻴﺚ ﳝﻜﻨﻨﺎ ان
ﻛﻠﻤﺔ واﺣﺪة .ﻓﺮﻏﻢ وﺟﻮد ﺣﺮﻳﺔ ﻛﺒﻴﺮة ﻓﻲ اﺧﺘﻴﺎر أﺳﻤﺎء اﳌﺘﻐﻴﺮات، ﻧﻄﻠﻖ ﻋﻠﻴﻪ اﺳﻢ pictureWidthﻛﺎﳌﺜﺎل ]. [2
إﻻ أن ﻫﻨﺎك ﻗﻮاﻋﺪ ﻣﻬﻤﺔ ﻳﻔﺘﺮض ﺑﺎﻟﺘﺴﻤﻴﺔ ان ﺗﺘﻄﺎﺑﻖ ﻣﻌﻬﺎ. ][2
;pictureWidth = ٨
وﺑﺎﻟﺮﻏﻢ ﻣﻦ ﻗﺪرﺗﻲ ﻋﻠﻰ ﺳﺮدﻫﺎ ﻛﺎﻣﻠﻪ ،اﻻ ان ذﻟﻚ ﺳﻴﺪﻋﻮ ﻟﻠﻤﻠﻞ. اﳌﺠﻤﻊ ﻣﻦ ﺗﻮﻗﻒ وﻓﺸﻞ ﻛﺒﻴﺮ ﳌﺠﺮد ﻧﺴﻴﺎﻧﻚ
ﻳﺤﺪﺛﻪ ّﻣﻦ ﻣﻨﻄﻠﻖ ﻣﺎ ّ
ﻋﻠﻰ ﻛﻞ ﺣﺎل اﻟﻘﺎﻋﺪة اﻻﺳﺎﺳﻴﺔ ﻫﻨﺎ ﺗﺸﺘﺮط اﻻ ﻳﻜﻮن اﺳﻢ اﳌﺘﻐﻴﺮ ﻹدراج اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ ﻋﻨﺪ ﻧﻬﺎﻳﺔ اﻟﺴﻄﺮ ،ﺳﻴﺠﻌﻠﻚ ذﻟﻚ ﺗﺪرك
ﻣﺤﺠﻮز ﻟﻠﻤﻔﺮدات اﶈﺠﻮزة ﻟﻠﻐﺔ ) Objective-Cاي ان ﻻ ﻳﻜﻮن أن اﻟﺒﺮﻣﺠﺔ ﺗﻬﺘﻢ ﺑﺎﻟﺘﻔﺎﺻﻴﻞ .أﺣﺪ ﺗﻠﻚ اﻟﺘﻔﺎﺻﻴﻞ اﻟﻮاﺟﺐ
اﻻﺳﻢ ذي دﻻﻟﺔ ﻣﻌﻴﻨﺔ ﻟﺪى .( Objective-C اﻟﺘﻨﺒﻪ ﻟﻬﺎ ﻫﻲ ﺣﻘﻴﻘﺔ ﺣﺴﺎﺳﻴﺔ اﻟﻨﺺ .case-sensitiveذﻟﻚ أن
pictureWidth ان ﲡﻤﻴﻊ اﺳﻢ اﳌﺘﻐﻴﺮ ﻣﻦ ﻋﺪة ﻛﻠﻤﺎت ﻛﺎﳌﺘﻐﻴﺮ اﺳﺘﺨﺪام ﺣﺮوف ﻻﺗﻴﻨﻴﺔ ﻛﺒﺮى ﻟﺘﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﻳﺆدي ﻷﺧﻄﺎء ﻓﻴﻤﺎ
ﻳﺠﻌﻞ ﻃﺮﻳﻖ ﺑﺮﻣﺠﺘﻚ آﻣﻦ ﻣﻦ اﻻﺧﻄﺎء .وﳉﻌﻞ اﳌﺘﻐﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻘﺮاءة ﻟﻮ اﺳﺘﺨﺪﻣﺖ اﳊﺮوف اﻟﺼﻐﺮى ﻟﻺﺷﺎرة ﻟﻠﻤﺘﻐﻴﺮ اﳌﻘﺼﻮد .ﻓﺎﺳﻢ
ﻳﻔﻀﻞ دوﻣ َﺎ اﺳﺘﺨﺪام ﺻﻴﻐﺔ اﳊﺮوف اﻟﻜﺒﺮى ﻛﻔﺎﺻﻞ ﻟﻠﻜﻠﻤﺎت اﳌﺘﻐﻴﺮ pictureWidthﻟﻴﺲ ﻫﻮ ذاﺗﻪ اﳌﺘﻐﻴﺮ pictureWIDTHأو
داﺧﻞ اﺳﻢ اﳌﺘﻐﻴﺮ .ان اﻟﺘﺰاﻣﻚ ﺑﻬﺬا اﻟﺘﻮﺟﻪ ﻳﻌﺼﻤﻚ ﻣﻦ اﺧﻄﺎء اﳌﺘﻐﻴﺮ .PictureWidth
ﺑﺮﻣﺠﻴﺔ ﻛﺜﻴﺮة. وﻛﺄﺳﻠﻮب ﻋﺎم ﰎ اﻻﺗﻔﺎق ﻋﻠﻰ ﻣﻨﻬﺞ ﻋﺎم ﻟﺘﺴﻤﻴﺔ اﳌﺘﻐﻴﺮات اﺗُﻔﻖ
ﻓﻲ ﺣﺎل اﺻﺮارك ﻟﺘﻌﻠﻢ اﻛﺜﺮ ﻣﻦ ﻗﺎﻋﺪة ﻟﺘﺴﻤﻴﺔ اﳌﺘﻐﻴﺮات ،أﻛﻤﻞ ﻋﻠﻰ أن ﺗﻜﻮن ﺗﺴﻤﻴﺎت اﳌﺘﻐﻴﺮات ﻣﻦ ﺧﻼل وﺿﻊ اﳊﺮوف اﻟﻜﺒﺮى
اﻟﻘﺮاءة ﻓﺒﺎﻻﺿﺎﻓﺔ اﻟﻰ اﳊﺮوف ﳝﻜﻨﻚ اﺳﺘﺨﺪام اﻻﻋﺪاد ﺷﺮﻳﻄﺔ اﻻ ﻓﻲ ﻋﺪة ﻣﻮاﻗﻊ ﻣﻦ ﺗﻌﺮﻳﻒ اﺳﻢ اﳌﺘﻐﻴﺮ ،ﻓﺎﳊﺮف اﻷول ﻣﻦ اﻟﻜﻠﻤﺔ
ﺗﻜﻮن ﻓﻲ ﺑﺪاﻳﺔ اﺳﻢ اﳌﺘﻐﻴﺮ .ﻛﺬﻟﻚ ﳝﻜﻨﻚ اﺳﺘﺨﺪام اﻟﺴﺎﻃﺮة اﻷوﻟﻰ ﺻﻐﻴﺮ وﻣﺎ ﻳﻠﻴﻪ ﻣﻦ ﻛﻠﻤﺎت ﺗﺎﻟﻴﺔ ﻳﻜﻮن أول ﺣﺮف ﻣﻨﻬﺎ
اﻟﺴﻔﻠﻴﺔ ”ـ“ ﻟﻠﺒﺪأ ﺑﺎﺳﻢ اﳌﺘﻐﻴﺮ أو اﻟﻔﺼﻞ ﺑﲔ اﻟﻜﻠﻤﺎت اﳌﻜﻮﻧﻪ ﻟﻪ. ﻛﺒﻴﺮ ،ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﺑﺎﳌﺜﺎل ].[2
وﻋﻨﺪ اﻻﻟﺘﺰام ﺑﻬﺬا اﻷﺳﻠﻮب ﳝﻜﻨﻚ أن ﺗﺘﻼﻓﻲ أﺧﻄﺎء اﻟﺒﺮﻣﺠﺔ
٩
اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
][4
;pictureWidth = 8 ﻫﻨﺎك ﻋﺪة ﻃﺮق ﻻﻃﻼق اﻻﺳﻤﺎء ،ﻓﻌﻠﻰ ﺳﺒﻴﻞ اﳌﺜﺎل:
;pictureHeight = 6
* pictureSurfaceArea = pictureWidth door8k, do8or, do_or -اﺳﻤﺎء ﻣﺘﻐﻴﺮات ﻣﻘﺒﻮﻟﺔ :
;pictureHeight
8door -اﺳﻤﺎء ﻣﺘﻐﻴﺮات ﻏﻴﺮ ﻣﻘﺒﻮﻟﺔ ) door 8 :ﲢﻮي ﻓﺮاغ( ,
واﻻن ﺗﻔﺤﺺ اﳌﺜﺎل ] ، [5وﺧﺼﻮﺻ َﺎ اﻟﺴﻄﺮان اﻻوﻻن. )ﺗﺒﺪأ ﺑﺮﻗﻢ(.
][5
;pictureWidth = 8
-ﻻ ﻳﻨﺼﺢ ﺑﺎﺳﺘﺨﺪاﻣﻬﺎ ) Door8 :ﺑﺪاﻳﺔ اﻻﺳﻢ ﺣﺮف ﻛﺒﻴﺮ(
;pictureHeight = 4.5
* pictureSurfaceArea = pictureWidth
واﻻن ﺑﻌﺪ ان ﺗﻌﻠﻤﻨﺎ ﻛﻴﻒ ﻧﺴﻨﺪ ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ ،ﳝﻜﻨﻨﺎ اﺟﺮاء
;pictureHeight ﺑﻌﺾ اﳊﺴﺎﺑﺎت ،ﻟﻨﺘﻔﺤﺺ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ ﺗﻘﻮم ﺑﺈﺣﺘﺴﺎب
integers ﳝﻜﻨﺎ ﺗﺼﻨﻴﻒ اﻻﻋﺪاد ﻋﻤﻮﻣ َﺎ اﻟﻰ ﻧﻮﻋﺎن :ﺻﺤﻴﺤﺔ ﻣﺴﺎﺣﺔ ﺳﻄﺢ اﻟﺼﻮرة .ﺑﺎﳌﺜﺎل ].[3
)اﻋﺪاد ﻛﺎﻣﻠﺔ ﻣﺜﻞ } ١و ٢٣و ٤٥٦و ( {٩٩٩واﻋﺪاد ﻛﺴﺮﻳﺔ ][3
;pictureWidth=8
fractionalﻣﺜﻞ } ١.٥و .{٧.٢٥ﻛﻤﺎ ﺗﺮى ﻓﻲ اﳌﺜﺎل ] [5.1و ;pictureHeight=6
] [5.2ﺳﻨﺴﺘﺨﺪم اﻻﻋﺪاد اﻟﺼﺤﻴﺤﺔ ﻻﺟﺮاء اﻟﻌﻤﻠﻴﺎت اﳊﺴﺎﺑﻴﺔ pictureSurfaceArea=pictureWidth*pictureHeig
;ht
وﺳﻨﺴﺘﺨﺪﻣﻬﺎ اﺣﻴﺎﻧ َﺎ اﺧﺮى ﻟﻠﻌﻤﻠﻴﺎت اﳌﺘﻜﺮرة ﻟﻌﺪد ﻣﻌﲔ ﻣﻦ
اﳌﺮات اﻧﻈﺮ اﻟﻔﺼﻞ .٧وﺳﻨﺴﺘﺨﺪم اﻻﻋﺪاد اﻟﻜﺴﺮﻳﺔ أو ﻣﺎ ﻳﻄﻠﻖ اﳌﺠﻤﻊ ﻻ ﻳﺼﺪر اي اﻋﺘﺮاض ﻋﻨﺪ وﺟﻮد ﺳﺘﺮى ﻛﻴﻒ ان ّ
ﻋﻠﻴﻬﺎ floating-pointﻛﻘﻴﻢ ﺣﺴﺎﺑﻴﺔ ﻻﺣﺘﺴﺎب ﻣﺘﻮﺳﻂ اﻫﺪاف ﻓﺮاﻏﺎت)اﳌﺴﺎﻓﺎت( )ﻋﺪا اﻟﺘﻲ ﺗﻮﺟﺪ ﻓﻲ اﺳﻤﺎء اﳌﺘﻐﻴﺮات أو
ﻼ.ﻛﺮة اﻟﺴﻠﺔ ﻣﺜ َ اﻟﻜﻠﻤﺎت اﶈﺠﻮزة ،،اﻟﺦ (.وﻟﻨﺠﻌﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻳﺴﺮ ﻗﺮاﺋﺔ،
ﳝﻜﻨﻨﺎ اﺿﺎﻓﺔ اﻟﻔﺮاﻏﺎت ﻛﺎﳌﺜﺎل ].[4
اﳌﺠﻤﻊ
ان اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﺑﺎﳌﺜﺎل ] [5ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻨﻔﻴﺬ .ذﻟﻚ ان ّ
ﻳﺸﺘﺮط ﻋﻠﻴﻚ اﺧﺒﺎرﻩ ﻣﺴﺒﻘ َﺎ ﺑﺎﺳﻤﺎء اﳌﺘﻐﻴﺮات اﻟﺘﻲ ﺳﺘﺴﺨﺪﻣﻬﺎ
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ
اﻟﺘﺎﻟﻴﺔ ،وﻫﻲ ﺗﻌﺮف رﺳﻤﻴ َﺎ ﺑﺎﺳﻢ اﳌُﻌﺎ ِﻣﻼت اﳊﺴﺎﺑﻴﺔ ﻻﻧﻬﺎ ﺗﻘﻮم ﳝﻜﻨﻬﺎ ان ﺗُﻐﺮق ﺣﻴﺰﻫﺎ ﻣﻦ اﳌﻞء ،ﳑﺎ ﻳﻘﻮدﻧﺎ ﻟﻼﺟﺎﺑﺔ ذات اﻟﺸﻖ
ﺑﺎﺟﺮاء اﻟﻌﻤﻠﻴﺎت اﳊﺴﺎﺑﻴﺔ اﻻﺳﺎﺳﻴﺔ. اﻟﺜﺎﻧﻲ :ﺣﻴﺚ اﻧﻪ ﻣﻦ واﺟﺒﻚ ﻛﻤﺒﺮﻣﺞ ان ﺗﺘﻨﺒﻪ ﳌﺜﻞ ﻫﺬﻩ اﳌﺸﺎﻛﻞ.
+ﻣﻌﺎﻣﻞ اﳉﻤﻊ ﻋﻠﻰ ﻛﻞ ﺣﺎل ،ﻫﺬﻩ اﳌﺸﻜﻠﺔ ﻏﻴﺮ ﻣﻨﺎﺳﺒﻪ ﻻن ﺗﻨﺎﻗﺶ ﻓﻲ اﻟﻔﺼﻞ
-ﻣﻌﺎﻣﻞ اﻟﻄﺮح اﻻول ﻣﻦ ﻛﺘﺎب ﻟﻠﻤﺒﺘﺪﺋﲔ.
/ﻣﻌﺎﻣﻞ اﻟﻘﺴﻤﺔ
* ﻣﻌﺎﻣﻞ اﻟﻀﺮب
ﻟﻠﻌﻠﻢ ﳝﻜﻦ ﻟﻘﻴﻤﺔ ﻛﻼ اﻟﻨﻮﻋﲔ )اﻟﺼﺤﻴﺢ واﻟﻜﺴﺮي( ان ﺗﻜﻮن
ﻼ .ﻓﻲ ﺣﺎل ﻳﻘﻴﻨﻚ ﻣﻦ ان اﻟﻘﻴﻤﺔ ﻟﻦ ﺳﺎﻟﺒﺔ ،ﻛﺤﺴﺎﺑﻚ اﻟﺒﻨﻜﻲ ﻣﺜ َ
ﺑﺎﺳﺘﺨﺪام ﺗﻠﻚ اﳌﻌﺎﻣﻼت ،ﳝﻜﻨﻨﺎ اﺟﺮاء ﻋﻤﻠﻴﺎت ﺣﺴﺎﺑﻴﺔ ﻣﺘﻨﻮﻋﺔ. ﺗﻜﻮن ﺳﺎﻟﺒﺔ ،ﳝﻜﻨﻚ ﻋﻨﺪﻫﺎ زﻳﺎدة اﳌﺪى اﳌﻘﺒﻮل ﻟﻠﻘﻴﻤﺔ اﳌﺘﺎﺣﺔ.
ﻓﻲ ﺣﺎل اﻟﻘﻴﺖ ﻧﻈﺮة ﻋﻠﻰ ﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ﺑﺎﺣﺪ ﻛﺘﺐ ﺑﺮﻣﺠﺔ ][7
،Objective-Cﺳﻴﺼﺎدﻓﻚ ﺗﺮﻣﻴﺰ ﻋﺠﻴﺐ ،وﻏﺎﻟﺒ َﺎ ان ﻛﺎﺗﺐ اﻟﺸﻔﺮة ;unsigned int chocolateBarsInStock
ﻛﺎﺗﺐ ﻛﺴﻮل .ﻓﺒﺪﻻ ﻣﻦ ﻛﺘﺎﺑﺔ اﻧﺖ ﺗﻌﻠﻢ ﻳﻘﻴﻨ َﺎ اﻧﻪ ﻟﻦ ﻳﻮﺟﺪ ﻟﺪﻳﻚ ﻟﻮح ﺷﻮﻛﻮﻻﺗﻪ ﺑﻘﻴﻤﺔ ﺳﺎﻟﺒﺔ،
;x = x + 1
ﻟﺬا ﳝﻜﻨﻚ اﺳﺘﺨﺪام ﺗﻨﻮﻳﻪ unsigned intاﳌﻮﺿﺢ ﺑﺎﳌﺜﺎل ] .[7ان
ﻣﺜﻞ ] [9أو ][10 ﳝﻴﻞ اﳌﺒﺮﻣﺠﻮن ﻻﺳﺘﺨﺪام ﺷﻲء ﻣﻦ ﻫﺬا اﻟﻘﺒﻴﻞ اﻻرﻗﺎم اﻟﻐﻴﺮ ﺳﺎﻟﺒﺔ ﳝﻜﻨﻬﺎ ان ﺗﻜﻮن ﺑﻘﻴﻤﺔ اﻛﺒﺮ أو ﺗﺴﺎوي ﺻﻔﺮ.
][9
;x++
ﳝﻜﻨﻚ دوﻣ َﺎ اﻻﻋﻼن ﻋﻦ اﳌﺘﻐﻴﺮ واﺳﻨﺎد ﻗﻴﻤﺘﻪ دﻓﻌﺔ واﺣﺪة ﺣﻴﺚ
ﳝﻜﻦ ﻟﻬﺬا اﻟﺴﻄﺮ ﺗﻮﻓﻴﺮ ﺑﻀﻌﺔ اﺳﻄﺮ ﻣﻦ اﻻﺳﻨﺎدات .ﻛﻤﺎ ﻫﻮ
][10
;++x ﻣﻮﺿﺢ ﲟﺜﺎل]. [8
][8
ﻓﻲ ﻛﻠﺘﺎ اﳊﺎﻟﺘﲔ ذﻟﻚ اﻻﻳﻌﺎز ﻳﻌﻨﻲ :ﻗﻢ ﺑﺰﻳﺎدة ﻗﻴﻤﺔ xﲟﻘﺪار .١ ;int x = 10
ﻓﻲ ﺣﺎﻻت ﺧﺎﺻﺔ ﻳﺠﺪر اﻻﻧﺘﺒﺎﻩ ﳌﻮﺿﻊ ++ﺳﻮاء ﻗﺒﻞ ام ﺑﻌﺪ اﳌﺘﻐﻴﺮ ;float y= 3.5, z = 42
.ﺗﻔﺤﺺ اﳌﺜﺎﻻن اﻟﺘﺎﻟﻴﺎن ] [11و ][12 ﻓﻲ اﳌﺜﺎل اﻟﺴﺎﺑﻖ ،ﻗﻤﻨﺎ ﺑﺎﺟﺮاء ﻋﻤﻠﻴﺔ ﺿﺮب ﻣﺴﺘﺨﺪﻣﲔ اﻟﺮﻣﻮز
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ
ﺑﺈﺟﺒﺎر ﺗﻨﻔﻴﺬ اﻟﻌﻤﻠﻴﺎت اﻟﺪﻧﻴﺎ ﻗﺒﻞ اﻟﻌﻤﻠﻴﺎت اﻟﻌﻠﻴﺎ ﻟﻴﻜﻮن ﻧﺎﰋ ][12
;x = 10
ﻋﻤﻠﻴﺔ (٣+٤)*٢ﻳﺴﺎوي .١٤ ;)y = 2 * (++x
أﻣﺎ اﻟﻘﺴﻤﺔ ﻓﺈﻧﻬﺎ ﻋﻤﻠﻴﺔ ﺗﺴﺘﺪﻋﻲ ﺑﻌﺾ اﻻﻧﺘﺒﺎﻩ ،ﺳﺒﺐ ذﻟﻚ ﻳﻌﻮد ﻓﻔﻲ اﳌﺜﺎل ] [11وﺑﻌﺪ ﻛﻞ ﻣﺎ ﻗﻴﻞ ،ﺳﺘﻜﻮن ﻗﻴﻤﺔ yﻣﺴﺎوﻳﺔ ﻟـ ٢٠
ﻟﻼﺧﺘﻼف اﻻﺳﺎﺳﻲ ﻋﻨﺪ اﺟﺮاءﻫﺎ ﻋﻠﻰ اﻋﺪاد ﺻﺤﻴﺤﺔ أو اﻋﺪاد ﺑﻴﻨﻤﺎ xﺗﺴﺎوي .١١ﻋﻠﻰ اﻟﻨﻘﻴﺾ ﻣﻦ ذﻟﻚ ﻓﻲ اﻻﻳﻌﺎز ],[12.2
ﻛﺴﺮﻳﺔ .ﺗﻔﺤﺺ اﳌﺜﺎﻟﲔ ] [14, 15اﻟﺘﺎﻟﻴﲔ: ،ﺳﻴﺘﻢ اﺿﺎﻓﺔ ﻗﻴﻤﺔ xﲟﻘﺪار ١ﻗﺒﻞ اﺟﺮاء ﻋﻤﻠﻴﺔ اﻟﻀﺮب ﺑـ ،٢
][14
;int x = 5, y = 12, ratio
ﻟﺬا ﻓﻲ اﻟﻨﻬﺎﻳﺔ ﺳﺘﻜﻮن xﺑﻘﻴﻤﺔ ١١و ﻗﻴﻤﺔ yﻣﺴﺎوﻳﺔ ﻟـ .٢٢ان
;ratio = y / x اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻓﻲ اﳌﺜﺎل ] [12ﻣﻄﺎﺑﻘﺔ ﻟﻠﻤﺜﺎل ].[13
][15 ][13
;float x = 5, y = 12, ratio ;x = 10
;ratio = y / x ;x++
;y = 2 * x
ﻓﻲ اﳌﺜﺎل اﻻول ﻛﺎﻧﺖ اﻟﻘﻴﻤﺔ اﻟﻨﺎﲡﺔ ﺗﺴﺎوي .٢ﺑﻴﻨﻤﺎ ﻓﻲ اﳌﺜﺎل
ﻣﻦ اﻟﻮاﺿﺢ ان اﳌﺒﺮﻣﺞ ﻗﺪ ﻗﺎم ﺑﺪﻣﺞ ﻋﻤﻠﻴﺘﲔ ﺣﺴﺎﺑﻴﺘﲔ ﻓﻲ ﺧﻄﻮة
اﻟﺜﺎﻧﻲ ﺳﺘﻜﻮن اﻟﻘﻴﻤﺔ اﻟﻨﺎﲡﺔ ﻫﻲ اﻟﺘﻲ ﺗﻮﻗﻌﺘﻬﺎ اي ٢٫٤
واﺣﺪة .وﺷﺨﺼﻴ َﺎ اﻋﺘﻘﺪ ان ﻫﺬا اﻻﺳﻠﻮب ﻳﺰﻳﺪ ﻣﻦ ﺻﻌﻮﺑﺔ ﻗﺮاءة
وﻓﻬﻢ اﻟﺒﺮﻧﺎﻣﺞ .ﻓﻲ ﺣﺎل اﻋﺘﻤﺎدك ﻟﺘﻠﻚ اﳌﺨﺘﺼﺮات ﻻ ﺑﺄس ﺑﺬﻟﻚ،
وﻟﻜﻦ ﺗﻨﺒﻪ ﻟﻮﺟﻮد اﺧﻄﺎء ﺑﺮﻣﺠﻴﺔ ﻣﺤﺘﻤﻠﺔ ﻫﻨﺎ وﻫﻨﺎك.
ﻗﺪ ﺗﻜﻮن اﳌﻌﻠﻮﻣﺎت اﻟﺘﺎﻟﻴﺔ ﻗﺪﳝﺔ ،وﻟﻜﻦ اﻻﻗﻮاس ﲢﺪد ﺗﺮﺗﻴﺐ
إﺟﺮاء اﻟﻌﻤﻠﻴﺎت اﳊﺴﺎﺑﻴﺔ .ﻓﻤﻦ اﻟﻄﺒﻴﻌﻲ ان ﻳﺘﻢ اﺟﺮاء ﻋﻤﻠﻴﺎت
اﻟﺒﺮﻧﺎﻣﺞ ﻋﺒﺎرة ﻋﻦ ﺗﻌﻠﻴﻤﺎت ﻣﺘﺘﺎﻟﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻻﺗﻬﻤﻞ اﻟﺘﻌﻠﻴﻘﺎت!!
ﻻﺗﻬﻤﻞ اﻟﺘﻌﻠﻴﻘﺎت!!
ﻧﺴﺘﻄﻴﻊ ﺑﺎﺳﺘﺨﺪام أﺳﻤﺎء ذات دﻻﻟﺔ ﻟﻠﻤﺘﻐﻴﺮات ان ﳒﻌﻞ ﻣﻦ
اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻧﺼﻮﺻ َﺎ ﻗﺎﺑﻠﺔ ﻟﻠﻘﺮاءة واﻟﺘﻔﺴﻴﺮ اﳌﻨﻄﻘﻲ].[1
][1
float pictureWidth, pictureHeight,
;pictureSurfaceArea
;pictureWidth = 8.0
;pictureHeight = 4.5
* pictureSurfaceArea = pictureWidth
;pictureHeight
١٥
ﻻﺗﻬﻤﻞ اﻟﺘﻌﻠﻴﻘﺎت!! ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻳﺠﺪر ﺑﻚ اﺳﺘﺨﺪام اﻟﺘﻌﻠﻴﻘﺎت ﻟﺸﺮح اﻻواﻣﺮ واﻟﺘﻌﻠﻴﻤﺎت اﻻﺟﺮاﺋﻴﺔ ٌﻳﻈﻬﺮ Xcodeاﻟﺘﻌﻠﻴﻘﺎت ﺑﺎﻟﻠﻮن اﻻﺧﻀﺮ .ﻣﺘﻰ ﻣﺎ ﻛﺎن اﻟﺘﻌﻠﻴﻖ
ﻃﻮﻳﻞ وﳝﺘﺪ ﻻﻛﺜﺮ ﻣﻦ ﺳﻄﺮ ،ﺿﻌﻪ ﻣﺎ ﺑﲔ * /و*/
اﻟﺘﻲ ﺗ ّﻮﺻﻒ وﺗﺸﺮح اﻟﺒﺮﻧﺎﻣﺞ ،ﺣﻴﺚ ﻳﺴﺘﺤﻴﻞ ﺑﺪوﻧﻬﺎ ﻓﻬﻢ وﺗﻔﺴﻴﺮ
دور ﺑﻌﺾ ﺗﻠﻚ اﻻﺟﺰاء ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ ﻋﻨﺪ اﻻﻋﺘﻤﺎد ﻋﻠﻰ اﻟﺸﻔﺮة /* This is a comment
extending over two lines */
ﻓﻘﻂ.
ﺳﻨﺘﻄﺮق ﻟﻌﻤﻠﻴﺎت ﺗﻘﺼﻲ اﺧﻄﺎء اﻟﺒﺮﻧﺎﻣﺞ ﻗﺮﻳﺒ َﺎ ،ﺣﻴﺚ ﻳﻮﻓﺮ ﻟﻚ
ﻛﻤﺜﺎل ﻟﺒﺮﻧﺎﻣﺞ ﺣﺴﺎﺑﻲ ﻳﺴﺘﺨﺪم ﻣﻌﺎﻣﻞ رﻳﺎﺿﻲ ﻣﺒﻨﻲ ﻣﻦ ﺧﻼل Xcodeﻋﺪد ﻣﻦ اﻻﻣﻜﺎﻧﻴﺎت اﻟﻔﺮﻳﺪة .وان اﺣﺪ اﻟﻄﺮق اﻻﻗﺪم ﻓﻲ
وﺻﻒ ﺗﻔﺼﻴﻠﻲ وارد ﺑﺄﺣﺪ اﻟﻜﺘﺐ ،ﻳﺠﺪر ﺑﻚ اﻟﺘﻨﻮﻳﻪ ﻋﻦ ذﻟﻚ اﻟﺘﻘﺼﻲ ﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ اﻟﻼﺗﻌﻠﻴﻘﺎت outcommentingوذﻟﻚ ﻣﻦ
اﻻرﺗﺒﺎط ﺑﺘﻌﻠﻴﻘﺎت داﺧﻞ ﺷﻔﺮﺗﻚ اﻟﺒﺮﻣﺠﻴﺔ .وﻓﻲ ﺑﻌﺾ اﻻﺣﻴﺎن ﺧﻼل ادراج ﺟﺰء ﻣﻦ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﺑﲔ ﺗﻠﻚ اﻻﺳﻄﺮ اﳌﺎﺋﻠﺔ ﺣﺘﻰ
ﻳﻔﻀﻞ اﻟﻘﻴﺎم ﺑﻌﻤﻞ ﻛﺘﺎﺑﺔ اﻟﺘﻌﻠﻴﻘﺎت ﻗﺒﻞ اﻟﺒﺪء اﻟﻔﻌﻠﻲ ﺑﻜﺘﺎﺑﺔ ﺗﺮى ﻛﻴﻒ ﺗﻌﻤﻞ ﺑﻘﻴﺔ اواﻣﺮ اﻟﺸﻔﺮة.
اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ .ﺗﻠﻚ اﻟﺘﻌﻠﻴﻘﺎت ﺗﻌﻴﻨﻚ اﺛﻨﺎء ﺑﻨﺎء اﻟﺒﺮﻧﺎﻣﺞ ﻫﺬا اﻻﺳﻠﻮب ّ
وﺳﺘﻜﻮن ﻧﺘﺎﺋﺞ اﳌﻌﺎﻳﻨﺔ اﻓﻀﻞ واﻳﺴﺮ. ﳝﻜﻨﻚ ﻣﻦ ﺗﻘﺼﻲ اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ ﻣﺘﻰ ﻣﺎ ﻛﺎن
اﳉﺰء اﶈﺠﻮب ﻣﺘﺴﺒﺒ َﺎ ﻓﻲ ﺗﻠﻚ اﻻﺧﻄﺎء ،ﻛﺄن ﲢﺠﺐ ﻗﻴﻤﺔ اﺣﺪ
ان اﻣﺜﻠﺔ اﻟﻜﺘﺎب ﻟﻴﺴﺖ ﺑﺎﻟﻀﺮورة ﻣﻮﺛﻘﺔ ﻛﻤﺎ ﻫﻲ اﳊﺎل داﺋﻤ َﺎ، اﳌﺘﻐﻴﺮات ،ﺣﻴﺚ ﳝﻜﻨﻚ ﺣﺠﺒﻬﺎ ﻣﺆﻗﺘ َﺎ ،ﺛﻢ اﺳﻨﺎد ﻗﻴﻤﺔ اﺧﺘﺒﺎرﻳﺔ
ذﻟﻚ اﻧﻬﺎ ﺗﺮد إﻟﻴﻚ وﻫﻲ ﻣﺤﺎﺻﺮة ﺑﺎﻟﺸﺮح واﻟﺘﻮﺿﻴﺢ. ﻟﺘﺠﺮﺑﺔ اداء ﺑﻘﻴﺔ اﺟﺰاء اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﻊ ﺗﻠﻚ اﻟﻘﻴﻤﺔ اﻻﺧﺘﺒﺎرﻳﺔ.
١٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ
اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ
ان اﻃﻮل ﺷﻔﺮة رأﻳﺘﻬﺎ ﺣﺘﻰ اﻻن ﻣﻜﻮﻧﺔ ﻣﻦ ﺧﻤﺴﺔ اﺳﻄﺮ .ﻛﺜﻴﺮ ﻣﻦ
اﻟﺒﺮاﻣﺞ ﻣﻜﻮﻧﺔ ﻣﻦ ﻋﺪة اﻻف ﻣﻦ اﻻﺳﻄﺮ و ﻗﺮاﺋﺘﻬﺎ ﺗﻜﻮن ﻣﺪﻋﺎة
ﻟﻠﻤﻠﻞ ،دﻋﻨﺎ ﻧﻨﺎﻗﺶ ﻃﺒﻴﻌﺔ ﻟﻐﺔ Objective-Cﻓﻲ ﺗﺮﺗﻴﺒﻬﺎ ﻟﻌﻨﺎﺻﺮ
اﻟﺒﺮﻧﺎﻣﺞ ﺑﺸﻜﻞ ﻣﺒﻜﺮ.ﻓﻤﺘﻰ ﻣﺎ ﻛﺎن اﻟﺒﺮﻧﺎﻣﺞ ﻣﻜﻮن ﻣﻦ ﻋﺪة
اﻻف ﻣﻦ اﻻﺳﻄﺮ واﻻواﻣﺮ اﳌﺘﻼﺣﻘﺔ ،ﺗﻜﻮن ﻧﺴﺒﺔ ﺗﻘﺼﻲ اﻻﺧﻄﺎء
اﻟﺒﺮﻣﺠﻴﺔ اﻛﺜﺮ ﺻﻌﻮﺑﺔ.
إن ذﻟﻚ ﺳﻴﺆدي ﻟﻮﺟﻮد ﺳﻠﺴﻠﺔ ﻣﺘﻮاﺻﻠﺔ ﻣﻦ اﻻواﻣﺮ اﳌﺘﻤﺎﺛﻠﺔ و
اﳌﺘﻜﺮرة ﺑﺤﻴﺚ ﺗﺘﺸﺎﺑﻚ ﺑﻌﺪة اﻣﺎﻛﻦ ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ .وﻫﺬا اﻟﺘﺸﺎﺑﻚ
ﺑﲔ اﻻواﻣﺮ اﺷﺒﺔ ﻣﺎ ﻳﻜﻮن ﺑﺼﺤﻦ ﻣﻌﻜﺮوﻧﺔ .spaghetti codeوﻣﺘﻰ
ﻣﺎﻛﺎن ﻫﻨﺎك ﺧﻄﺎء ﺑﺮﻣﺠﻲ ﻓﻲ اﺣﺪ ﺗﻠﻚ اﻟﺴﻼﺳﻞ ،ﺳﻴﺘﻄﻠﺐ
اﺻﻼﺣﻬﺎ ﺗﻜﺮار ﻋﻤﻠﻴﺔ اﻻﺻﻼح ﺑﺎي ﻣﻮﻗﻊ ﺗﻜﺮر ورودﻫﺎ ﻓﻴﻪ .،اﻧﻪ
اﻟﻜﺎﺑﻮس ﺑﻌﻴﻨﺔ! ﻓﻤﻦ اﻟﺴﻬﻞ ﺟﺪاَ ان ُﻳﻨﺴﻰ ﺗﻌﺪﻳﻞ ﺟﺰء أو اﺛﻨﺎن
اﺛﻨﺎء ﻋﻤﻠﻴﺔ اﻟﺘﺼﺤﻴﺢ!
ﻟﺬا ﻓﻜﺮ اﳌﺒﺮﻣﺠﻮن ﺑﻌﺪة ﻃﺮق ﻟﺘﻨﻈﻴﻢ اﻻﺟﺰاء اﳌﻜﻮﻧﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ،
ﳑﺎ ﺳﻬﻞ ﻣﻦ ﻋﻤﻠﻴﺎت ﺗﻘﺼﻲ اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ .ﻟﻘﺪ ﲤﺜﻞ اﳊﻞ
ﺑﺤﺼﺮ ﺟﻤﻴﻊ ﺗﻠﻚ اﳌﺠﻤﻮﻋﺎت ﻣﻦ اﻻواﻣﺮ واﻻﺟﺮاءات ﺑﻨﺎء ﻋﻠﻰ
ﻃﺒﻴﻌﺔ اداﺋﻬﺎ.
١٧
اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﻻﻗﻮاس ﻫﻨﺎ ،اﻧﻬﺎ ﻣﻮﺟﻮدة ﻟﺴﺒﺐ ﻣﻬﻢ ﺟﺪاَ ،اﻻ اﻧﻨﺎ ﺳﻨﻨﺎﻗﺶ ذﻟﻚ ﲤﻜﻨﻚ ﻣﻦ ﺣﺴﺎب ﻣﺴﺎﺣﺔ ﺳﻄﺢ ﻛﻤﺜﺎل ﳝﻜﻨﻚ ﺟﻤﻊ ﻋﺪة اواﻣﺮ ّ
ﻻﺣﻘ َﺎ ﺧﻼل ﻫﺬا اﻟﻔﺼﻞ. اﻟﺪاﺋﺮة .وﻣﺎ ان ﺗﺘﺄﻛﺪ ﻣﻦ ﻣﺪى ﺻﻼﺣﻴﺔ وﺻﺤﺔ ﻋﻤﻞ ﺗﻠﻚ
ﻓﻲ اﻻﺳﻄﺮ اﻟﺘﺎﻟﻴﺔ ﻣﻦ اﻟﺸﻔﺮة ﺳﻨﺠﺪ اﻗﻮاس ﻣﻌﻘﻮﻓﺔ .ﺣﻴﺚ ُﻳﺘﻮﻗﻊ اﳌﺠﻤﻮﻋﺔ ﻣﻦ اﻻواﻣﺮ وﻧﺘﺎﺟﻬﺎ اﻟﺼﺤﻴﺢ ،ﻓﺎﻧﻚ ﻟﻦ ﺗﻌﻮد اﻟﻴﻬﺎ ﻣﺮة
ﻣﻨﺎ ادراج اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ أو ﻣﺎ ﻳﻄﻠﻖ ﻋﻠﻴﻪ اﻟﺒﻨﻴﺔ اﻟﺒﺮﻣﺠﻴﺔ ﻟﻠﺪاﻟﺔ اﺧﺮى ﻟﺘﻘﺼﻲ اﻻﺧﻄﺎء.
. bodyﻟﻘﺪ ﻧﺴﺨﻨﺎ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﻦ اﻟﻔﺼﻞ اﻟﺴﺎﺑﻖ ووﺿﻌﻨﺎﻫﺎ انﻣﺠﻤﻮﻋﺔاﻻواﻣﺮ ﺗﻠﻚ ﻫﻲﻣﺎﻳﻄﻠﻖﻋﻠﻴﻬﺎاﻟﺪوال/اﻟﺪاﻻتاﻟﺒﺮﻣﺠﻴﺔ
ﻓﻲ ﻣﻜﺎﻧﻬﺎ اﻟﺼﺤﻴﺢ ﺣﻴﺚ ﻳﺠﺐ ان ﺗﻜﻮن].[2 functionوﳝﻜﻨﻨﺎ اﻃﻼق ﻣﺴﻤﻴﺎت ﳑﻴﺰة ﻟﻬﺎ ،ﺣﻴﺚ ﳝﻜﻨﻨﺎ اﺳﺘﺪﻋﺎء
][2 وﻇﺎﺋﻔﻬﺎ ﻣﻦ ﺧﻼل اﻳﺮاد اﺳﻤﺎﺋﻬﺎ داﺧﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ.
)(main
{
// Variables are declared below
ﻫﺬا اﳌﺒﺪء ﻛﺎن ﲟﺜﺎﺑﺔ اﻟﺘﻮﺟﻪ اﻟﺮﺋﻴﺲ ﻻﺳﺘﺨﺪام اﻟﺪوال ،ﺣﺘﻰ ان
float pictureWidth, pictureHeight, اي ﺑﺮﻧﺎﻣﺞ ﻳﺘﻜﻮن ﻣﻦ داﻟﺔ واﺣﺪة ﻋﻠﻰ اﻻﻗﻞ ﺗﻌﺮف ﺑﺎﺳﻢ )(.main
;pictureSurfaceArea
اﳌﺠﻤﻊ ،اﻧﻪ ﻳﺴﺘﺪل ﺑﻬﺎ
ﻫﺬﻩ اﻟﺪاﻟﺔ )( mainﻫﻲ ﻣﺎ ﻳﺒﺤﺚ ﻋﻨﻪ ّ
// We initialize the variables (we give
)the variables a value ﻟﻴﺒﺪاء ﺗﻨﻔﻴﺬ اﻻواﻣﺮ واﻻﺟﺮاءات اﻟﺘﺎﻟﻴﺔ وﻗﺖ ﺗﺸﻐﻴﻞ وﺗﻨﻔﻴﺬ
;pictureWidth = 8.0
;pictureHeight = 4.5 اﻟﺒﺮﻧﺎﻣﺞ .دﻋﻨﺎ ﻧﺘﻔﺤﺺ اﻟﺪاﻟﺔ )( mainﲟﺰﻳﺪ ﻣﻦ اﻟﺘﻔﺼﻴﻞ].[1
][1
// Here the actual calculation is )(main
performed
* pictureSurfaceArea = pictureWidth {
;pictureHeight // Body of the main() function. Put your
} code here.
}
اذا ﻣﺎ اﺳﺘﻤﺮﻳﻨﺎ ﺑﺎدراج ﻣﺰﻳﺪ ﻣﻦ اﺳﻄﺮ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻟﺒﻨﻴﺔ اﻟﺪاﻟﺔ
اﻟﺒﻴﺎن ] [1.1ﻳﻈﻬﺮ اﺳﻢ اﻟﺪاﻟﺔ ” “mainﻳﺘﺒﻌﺔ اﻗﻮاس .ان ﻛﻠﻤﺔ main
)( mainﺳﻨﺼﻞ ﻟﻨﺘﻴﺠﺔ ﺣﺘﻤﻴﺔ ﻣﻔﺎدﻫﺎ اﺳﺘﺤﺎﻟﺔ أو ﺻﻌﻮﺑﺔ اﺟﺮاء اي
ﺗﻘﺼﻲ ﻟﻸﺧﻄﺎء. ﻛﻠﻤﺔ ﻣﺤﺠﻮزة ،ﺣﻴﺚ ﲤﺜﻞ داﻟﺔ ﻣﻄﻠﻮﺑﻪ اﺳﺎﺳ ًﺎ ﻻن ﻳﻜﻮن ﻫﻨﺎك
ﺑﺮﻧﺎﻣﺞ ،وﳝﻜﻦ ﻟﺪاﻻﺗﻚ اﻻﺧﺮى ان ﺗُﺴﻤﻰ ﺑﺎي اﺳﻢ اﺧﺮ .ﻻﺣﻆ
١٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ
ﻫﺬﻩ اﻟﺪاﻟﺔ ﻏﻴﺮ ﻣﻌﺸﺸﺔ ﺑﺎﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ. ذﻟﻚ ان ﺗﺘﺎﻟﻲ ﺗﻠﻚ اﻻﺳﻄﺮ ﻳﻘﻮدﻧﺎ ﲡﺎﻩ ﺑﻨﻴﺔ ﻏﻴﺮ ﻣﻬﻴﻜﻠﺔ
وﺣﺘﻰ ﺗﺆدي داﻟﺘﻨﺎ اﳉﺪﻳﺪة )( circleAreaدورﻫﺎ ﻳﺠﺐ ﻋﻠﻴﻨﺎ unstructuredﻳﺠﺪر ﺑﻨﺎ ﺗﻼﻓﻴﻬﺎ اﺛﻨﺎء اﻟﺒﺮﻣﺠﺔ .ﻟﺬا دﻋﻨﺎ ﻧﻌﻴﺪ
اﺳﺘﺪﻋﺎﺋﻬﺎ داﺧﻞ ﻧﻄﺎق اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ .ﻟﻨﺮى ﻛﻴﻒ ﻳﺘﻢ ذﻟﻚ. ﻛﺘﺎﺑﺔ اﻟﺒﺮﻧﺎﻣﺞ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﻬﻴﻜﻠﺔ .structureﺑﻐﺾ اﻟﻨﻈﺮ
][4 ﻋﻦ اﻟﺪاﻟﺔ اﻻﺟﺒﺎرﻳﺔ ،ﳝﻜﻨﻨﺎ اﺳﺘﺤﺪاث داﻟﺔ ﺟﺪﻳﺪة وﻧﻄﻠﻖ ﻋﻠﻴﻬﺎ
)(main اﺳﻢ )( circleAreaﻛﻤﺎ ﺑﺎﳌﺜﺎل ] [3اﻟﺘﺎﻟﻲ:
{
][3
float pictureWidth, pictureHeight,
)(main
pictureSurfaceArea,
{
;circleRadius, circleSurfaceArea
float pictureWidth, pictureHeight,
]// [4.4
;pictureSurfaceArea
;pictureWidth = 8.0
;pictureWidth = 8.0
;pictureHeight = 4.5
;pictureHeight = 4.5
]circleRadius = 5.0; // [4.7
* pictureSurfaceArea = pictureWidth
* pictureSurfaceArea = pictureWidth
;pictureHeight
;pictureHeight
}
!// Here we call our function
)(circleArea ]// [3.9
circleSurfaceArea = circleArea(circleRadi
{
]us); // [4.11
}
}
ﻣﻠﺤﻮﻇﺔ :ﺑﺎﻗﻲ ﺷﻔﺮة اﻟﺒﺮﻧﺎﻣﺞ ﻏﻴﺮ ﻣﻜﺘﻤﻠﺔ ﻫﻨﺎ اﻧﻈﺮ اﳌﺜﺎل ]. [3 ﻼ ،اﻻ ان داﻟﺘﻨﺎ )( circleAreaاﳌﺴﺘﺤﺪﺛﺔ ﻻﻟﻘﺪ ﻛﺎن ذﻟﻚ ﺳﻬ َ
ﺗﻘﻮم ﺑﺎي ﺷﻲء ﺣﺎﻟﻴ َﺎ .ﻟﻜﻦ ﻻﺣﻆ ان ﺗﻮﺻﻴﻒ اﻟﺪاﻟﺔ )(circleArea
ﻟﻘﺪ اﺿﻔﻨﺎ ﻣﺘﻐﻴﺮان ﲟﺴﻤﻴﺎت ﻣﻦ ﻧﻮع ﻋﺪدي ﻛﺴﺮي floatﻓﻲ]،[4.4
وﺑﻨﻴﺘﻬﺎ اﻟﺒﺮﻣﺠﻴﺔ ﺧﺎرج ﻧﻄﺎق اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ )( ،mainﲟﻌﻨﻰ اﺧﺮ
١٩
اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
وذﻟﻚ ﺑﻨﻔﺲ اﻻﺳﻠﻮب اﳌﺴﺘﺨﺪم ﻟﻠﺘﺼﺮﻳﺢ ﻋﻦ اﻟﺪاﻟﺔ ].main [4.4 وﻗﺪ ﻗﻤﻨﺎ ﺑﺘﻬﺌﻴﺔ اﳌﺘﻐﻴﺮ - initializeﲟﻌﻨﻰ اﺳﻨﺪﻧﺎ ﻟﻪ ﻗﻴﻤﺔ ﻣﺒﺪﺋﻴﺔ
ﺣﻴﺚ ﺳﺘﻠﺤﻆ ان اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﳌﺘﻐﻴﺮ theRadiusﻗﺪ ﰎ ﺧﻼل ] -[4.7وﻣﻦ اﻛﺜﺮ ﻣﺎ ﻳﻠﻔﺖ اﻟﻨﻈﺮ ] [4.11ﻛﻴﻔﻴﺔ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ
اﻗﻮاس ] .[5.1وﻳﻌﻴﺪ اﻟﺴﻄﺮ ] [5.5اﻟﻨﺎﰋ اﻟﻰ ذﻟﻚ اﳉﺰء ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ )( circleAreaﻓﻜﻤﺎ ﺗﺮى ﻟﻘﺪ ادرﺟﻨﺎ اﺳﻢ اﳌﺘﻐﻴﺮcircleRadius
اﻟﺬي ﺣﺪث ﻓﻴﻪ اﺳﺘﺪﻋﺎء ﻫﺬﻩ اﻟﺪاﻟﺔ .وﻛﻨﺘﻴﺠﺔ ﻟﺬﻟﻚ ﻧﺮ'ى ﺑﺎﻟﺴﻄﺮ ﺑﲔ اﻗﻮاس ﻓﻬﻮ ﻣﻌﺎﻣﻞ ﻟﻠﺪاﻟﺔ )(. circleArea
] ،[4.11ان ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ circleSurfaceAreaﻗﺪ اﺻﺒﺤﺖ ﺗﻠﻚ ﺳﻮف ﻳﺘﻢ ﲤﺮﻳﺮ ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ circleRadiusاﻟﻰ اﻟﺪاﻟﺔ )(.circleArea
اﻟﻘﻴﻤﺔ اﳌﺴﻨﺪة اﻟﻴﻪ ﻣﻦ ذﻟﻚ اﻻﺳﺘﺪﻋﺎء. وﻣﺘﻰ ﻣﺎ ﻗﺎﻣﺖ اﻟﺪاﻟﺔ ﺑﺎﻻﻧﺘﻬﺎء ﻣﻦ اﳒﺎز ﺧﻄﻮات ﻋﻤﻠﻬﺎ ﺣﺴﺎﺑﻴ َﺎ
ان اﻟﺪاﻟﺔ ﺑﺎﳌﺜﺎل ] [5ﻛﺎﻣﻠﺔ ﻋﺪا ﻋﻦ اﻣﺮ واﺣﺪ .ﻓﻨﺤﻦ ﻟﻢ ﻧﻘﻢ ﺑﺘﻌﻴﲔ ﺳﺘﻘﻮم ﺑﺎرﺟﺎع ﻧﺘﻴﺠﺔ ﺣﺘﻤﻴﺔ.دﻋﻨﺎ ﻧﻘﻮم ﺑﺘﻌﺪﻳﻞ اﻟﺪاﻟﺔ ﻣﻦ اﳌﺜﺎل ][3
”"ﻧﻮع “Type -اﻟﺒﻴﺎﻧﺎت اﻟﻌﺎﺋﺪ ﻣﻨﻬﺎ .وذﻟﻚ ﻣﻄﻠﺐ اﺳﺎﺳﻲ ﺣﺘﻰ ﻟﺘﻜﻮن ﻛﻤﺎ ﻫﻲ ﺑﺎﳌﺜﺎل].[5و ﺳﻨﻌﺮض داﻟﺔ )( circleAreaﻓﻘﻂ.
اﳌﺠﻤﻊ ﻣﻦ اﻟﻘﻴﺎم ﺑﻌﻤﻠﻪ ،وﻣﺎ ﻋﻠﻴﻨﺎ اﻻ اﻟﻄﺎﻋﺔ واﻟﺘﻨﻮﻳﻪ ﻋﻦ
ﻳﺘﻤﻜﻦ ّ ][5
اﻟﻨﻮع ﻋﻠﻰ ان ﻳﻜﻮن ﻋﺪدي ﻛﺴﺮي].[6.1 ]circleArea(float theRadius) // [5.1
{
][6 ;float theArea
)float circleArea(float theRadius ;theArea = 3.1416 * theRadius * theRadius
{ // pi times r square ][5.4
;float theArea ;return theArea
;theArea = 3.1416 * theRadius * theRadius }
;return theArea
} )(circleAreaﺑﺎﻟﺴﻄﺮ ] [5.1ﺻﺮﺣﻨﺎ ﺑﺎن ﺗﻜﻮن ﻗﻴﻤﺔ ﻣﻌﺎﻣﻞ داﻟﺔ
ﻛﻤﺎ ﻫﻮ ﻣﻼﺣﻆ ان اول ﻛﻠﻤﺔ ﺑﺎﻟﺒﻴﺎن ] [6.1ﺗﺼﺮح ﻋﻦ ﻧﻮع ﻗﻴﻤﺔ ﻛﺴﺮﻳﺔ .ﻣﺘﻰ ﺗﺴﻠﻢ اﳌﻌﺎﻣﻞ ﻗﻴﻤﺘﻪ ،ﺳﺘﺨﺰن ﺑﺎﳌﺘﻐﻴﺮ اﳌﺴﻤﻰ
اﻟﺒﻴﺎﻧﺎت اﻟﻌﺎﺋﺪ ﻣﻦ ﻫﺬﻩ اﻟﺪاﻟﺔ -ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ - theAreaوﻫﻲ ﻫﻨﺎ .theRadius
ﻣﻦ ﺻﻨﻒ ﻋﺪد ﻛﺴﺮي .و ﻣﻦ واﺟﺒﻚ ﻛﻤﺒﺮﻣﺞ ﺣﺮﻳﺺ ،اﳊﺮص وﻟﻘﺪ اﺳﺘﺨﺪﻣﻨﺎ ﻣﺘﻐﻴﺮاَ اﺧﺮ -اﺳﺘﺨﺪﻣﻨﺎ theAreaﻟﺘﺨﺰﻳﻦ ﻧﺎﰋ
ﻋﻠﻰ اﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻣﺘﻐﻴﺮ circleSurfaceAreaاﳌﺪرج داﺧﻞ ﻧﻄﺎق اﻟﻌﻤﻠﻴﺔ اﳊﺴﺎﺑﻴﺔ ] ،[5.4ﻟﺬا ﻳﺠﺐ ﻋﻠﻴﻨﺎ اﻟﺘﺼﺮﻳﺢ ﻋﻨﻪ ]،[5.3
٢٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ
ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻟﻠﺪاﻟﺔ اﳌﺴﺘﺨﺪﻣﺔ اﻛﺜﺮ ﻣﻦ ﻣﻌﺎﻣﻞ ﻣﻄﻠﻮب )( mainان ﻳﺴﺘﻘﺒﻞ ﻧﻔﺲ ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﳌﺘﻔﻖ اي ﻋﺪد ﻛﺴﺮي،
Argumentsﻛﺎﻟﺪاﻟﺔ )( pictureSurfaceAreaوﻫﻲ ﺗﺴﺘﺨﺪم اﳌﺠﻤﻊ ﻣﻦ اﺻﺪار ﺗﻠﻚ اﻟﺮﺳﺎﺋﻞ اﳌﺰﻋﺠﺔ .وﻻ ﻳﺸﺘﺮطوذﻟﻚ ﳌﻨﻊ ّ
ﻣﻌﺎﻣﻼن ﻛﻤﺎل ﺑﺎﳌﺜﺎل] ، [9ﻋﻨﺪﻫﺎ ﻳﺠﺐ ان ﻧﺴﺘﺨﺪم ﻓﺎﺻﻞ ﺑﲔ دوﻣ َﺎ ان ﺗﻜﻮن ﻫﻨﺎك ﻣﻌﺎﻣﻼت ﻟﻠﺪاﻻت .وﺣﺘﻰ ﻋﻨﺪﺋﺬ ﻳﺸﺘﺮط ان
اﻟﻌﻮاﻣﻞ اﳌﺘﻌﺪدة وذﻟﻚ ﺑﻮﺿﻊ ﻓﺎﺻﻠﺔ اﻋﺘﻴﺎدﻳﺔ" "،ﺑﺒﲔ اﻟﻌﻮاﻣﻞ. ﺗﻜﻮن ﻫﻨﺎك اﻗﻮاس وﻟﻮ ﻛﺎﻣﻦ ﻓﺎرﻏﺔ.
][9 ][7
float pictureSurfaceArea(float theWidth, float )(int throwDice
)theHeight {
{ ;int noOfEyes
// Code here
} // Code to generate a random value from 1
to 6
return ان اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainﺗﺘﻄﻠﺐ ارﺟﺎع ﻗﻴﻤﺔ ﻣﺮﲡﻌﺔ
،valueوﻫﻲ ﺗﺮﺟﻊ ﻗﻴﻤﺔ ﺻﺤﻴﺤﺔ ،integerوﻳﺠﺪر ﺑﻬﺎ ارﺟﺎع }
;return noOfEyes
٢١
اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻛﻤﺎ ﺗﺮى ﻓﻲ] ، [10ﻟﺪﻳﻨﺎ داﻟﺔ )( [10.1] mainوداﻟﺔ اﺧﺮى ﻣﻌﺮﻓﺔ ﻣﻦ ][10
)(int main
اﳌﺠﻤﻊ ﻓﻲ ﺣﻴﺮة ﻣﻦ اﻣﺮﻩ ﻋﻨﺪ ﻗﻴﺎﻣﻨﺎ ﺑﺘﺠﻤﻴﻊﻗﺒﻠﻨﺎ] .[10.13ﺳﻴﻈﻞ ّ {
وﲡﻤﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ .ﻓﻔﻲ اﻟﺴﻄﺮ ] [10.9ﺳﻴﺪﻋﻲ ﻋﺪم ﻣﻌﺮﻓﺘﻪ ﺑﺎي داﻟﺔّ float pictureWidth, pictureHeight,
اﺳﻤﻬﺎ )(. circleAreaﻳﺎ ﺗﺮى ﳌﺎذا؟ pictureSurfaceArea,
;circleRadius, circleSurfaceArea
اﳌﺠﻤﻊ ﻗﺪ ﺑﺪاء ﺑﺘﻔﺴﻴﺮ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainﺛﻢ
ﻣﻦ اﻟﻮاﺿﺢ ان ّ ;pictureWidth = 8
ﺗﻮاﺟﻪ ﻓﺠﺄة ﻣﻊ ﻣﺎ ﻻ ﻳﻌﺮف ﻛﻴﻒ ﻳﺘﻌﺎﻣﻞ ﻣﻌﻪ .ﻋﻨﺪﻫﺎ ﺗﻮﻗﻒ ﻋﻦ ;pictureHeight = 4.5
اﻟﻌﻤﻞ اﳌﻨﺎط ﺑﻪ وأﻇﻬﺮ ﻟﻚ رﺳﺎﻟﺔ ﲢﺬﻳﺮﻳﺔ. ;circleRadius = 5.0
اﳌﺠﻤﻊ ﻟﻴﺘﺠﺎوز ﻫﺬﻩ اﳌﺸﻜﻠﺔ ،ﻗﻢ ﺑﻮﺿﻊ اﻟﺘﺼﺮﻳﺢ ﻋﻦ ﺣﺘﻰ ﺗﺮﺿﻲ ّ * pictureSurfaceArea = pictureWidth
;pictureHeight
اﻟﺪاﻟﺔ ﻓﻲ ﻣﻮﻗﻊ اﻋﻠﻰ ﻣﻦ ﺑﻴﺎن اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ ].int main() [11.1 circleSurfaceArea = circleArea(circleRadi
ﻻﺷﻲء ﺻﻌﺐ ﺣﻴﺎل ذﻟﻚ ،ﻋﺪا اﻧﻪ ﻣﺜﻞ ﻣﺎ ورد ﺑـ ] [10.13ﻓﻬﻮ ﻫﻨﺎ ;)us ]// [10.9
إﻳﻌﺎز ﻣﻨﺘﻬﻲ ﺑﻔﺎﺻﻠﺔ ﻣﻨﻘﻮﻃﺔ. ;return 0
][11 }
;)float circleArea(float theRadius //
function declaration )float circleArea(float theRadius
]// [10.13
)(int main
{ {
;float theArea
ﻣﻠﺤﻮﻇﺔ :ﺑﻘﻴﺔ اﻟﺒﺮﻧﺎﻣﺞ ﻛﻤﺎ ﻫﻮ ﻓﻲ اﳌﺜﺎل] .[10وﻗﺮﻳﺒﺎ ﺳﻨﺮﻛﻢ ;theArea = 3.1416 * theRadius * theRadius
وﻧﺸﻐّﻞ ﻫﺬا اﻟﺒﺮﻧﺎﻣﺞ ،ﺣﺎﻟﻴ َﺎ ﻟﺪﻳﻨﺎ اﺷﻴﺎء ﻣﻦ ﻫﻨﺎ وﻫﻨﺎك. ;return theArea
}
٢٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ
ﻻﺳﺘﻌﺮاض ﻛﻴﻔﻴﻪ اﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻣﺘﻐﻴﺮ داﺧﻞ ﻧﻄﺎق اﻟﺪاﻟﺔ. ﻣﻦ ﻫﻨﺎ وﻫﻨﺎك
ﻓﺒﺎﻟﺮﻏﻢ ﻣﻦ ﺳﻬﻮﻟﺔ اﻟﺪاﻻت اﻟﺘﻲ ﻋﺮ ّﻓﻨﺎﻫﺎ ﺑﺎﻧﻔﺴﻨﺎ ﻓﻲ ﻫﺬا اﻟﻔﺼﻞ، ﻓﺄﺛﻨﺎء ﻛﺘﺎﺑﺔ اﻟﺒﺮاﻣﺞ ،ﻳﻨﺼﺢ دوﻣ َﺎ ﺑﺎﻋﺘﻤﺎد اﻋﺎدة اﺳﺘﺨﺪام اﻟﺸﻔﺮة
اﻻ اﻧﻪ ﻣﻦ اﳌﻬﻢ اﻟﺘﻨﺒﻪ ﻻﻣﻜﺎﻧﻴﺔ ﺗﻐﻴﻴﺮ اﻟﺪوال دون اﺣﺪاث ﺻﺪﻣﺔ اﻟﺒﺮﻣﺠﻴﺔ .code reuseﻓﻔﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ ﻫﺬا ﳝﻜﻨﻨﺎ اﺿﺎﻓﺔ داﻟﺔ
ﻓﻲ أداء اﻟﺒﺮﻧﺎﻣﺞ ﻃﺎﳌﺎ ﻟﻢ ﺗﻐﻴﺮ اﻟﺴﻄﻮر اﻻوﻟﻰ ﻣﻦ ﺗﺼﺎرﻳﺢ اﻟﻘﻴﻢ اﺣﺘﺴﺎب ﻣﺴﺎﺣﺔ اﳌﺴﺘﻄﻴﻞ )( ،rectangleAreaﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ
اﻟﻌﺎﺋﺪة واﻧﻮاع ﻣﻌﺎﻣﻼت اﻟﺪوال. ﺑﺎﳌﺜﺎل] ،[12وﳝﻜﻦ اﺳﺘﺪﻋﺎﺋﻬﺎ ﻣﻦ ﻧﻄﺎق اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )(.main
ﻛﻤﺜﺎل ﳝﻜﻨﻚ ﺗﻐﻴﻴﺮ اﺳﻤﺎء اﳌﺘﻐﻴﺮات داﺧﻞ اﻟﻨﻄﺎق اﶈﻠﻲ ﻟﻠﺪاﻟﺔ ﻫﺬا اﻻﻣﺮ ﻣﻔﻴﺪ ﺣﺘﻰ ﻟﻮ ﻛﺎن اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻫﺬﻩ اﻟﺪاﻟﺔ ﺳﻴﺘﻢ ﳌﺮة
،variable scopeوﻣﻊ ذﻟﻚ ﺳﺘﻈﻞ اﻟﺪاﻟﺔ ﺗﺆدي ﻋﻤﻠﻬﺎ اﳌﻄﻠﻮب واﺣﺪة ﻓﻘﻂ وﻗﺖ ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ.
-وﻟﻦ ﻳﻜﻮن ﻟﺬﻟﻚ اي اﺛﺮ اﻋﺘﺮاﺿﻲ ﺑﺎﺟﺰاء اﻟﺒﺮﻧﺎﻣﺞ.- ﺳﺘﺠﺪ ان اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainاﺻﺒﺤﺖ ﻗﺮاﺋﺘﻬﺎ اﻳﺴﺮ ،وﻣﺘﻰ ﻣﺎ
وﳝﻜﻦ ﳌﺒﺮﻣﺞ آﺧﺮ ﻛﺘﺎﺑﺔ ﺑﻨﻴﺔ ﺗﻠﻚ اﻟﺪاﻟﺔ ،ﺣﻴﺚ ﲟﻜﻨﻚ اﺳﺘﺨﺪاﻣﻬﺎ ﻗﻤﺖ ﺑﺘﻘﺼﻲ اﻻﺧﻄﺎء ﺳﻴﻜﻮن اﻳﺠﺎدﻫﺎ اﺳﻬﻞ ،وﻗﺪ ﺗﻀﻊ ﻳﺪك
ﺑﺪﻻ ﻣﻦ ان ﺗﻄﻮفﻋﻠﻰ ﺧﻄﺎء ﺑﺮﻣﺠﻲ داﺧﻞ اﺣﺪ ﺗﻠﻚ اﻟﺪوالَ ،
دون اﻟﺘﻌﻤﻖ ﻓﻲ ﻓﻬﻢ ﻛﻴﻔﻴﻪ ﻋﻤﻠﻬﺎ اﻟﺪاﺧﻠﻲ ،ﻓﻜﻞ ﻣﺎ ﻫﻮ ﻣﻄﻠﻮب
ﻣﻨﻚ ﻫﻮ ان ﺗﺘﻌﺮف ﻋﻠﻰ ﻛﻴﻔﻴﻪ اﺳﺘﺨﺪاﻣﻬﺎ .وذﻟﻚ ﻳﻌﻨﻲ ﻣﻌﺮﻓﺔ: ﺑﻜﺎﻓﺔ اﻟﻜﺘﻞ اﳌﻜﻮﻧﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ ،ﻛﻞ اﳌﻄﻠﻮب ﻣﻨﻚ ﻫﻮ ﺗﻔﺤﺺ ﺟﺰﺋﻴﺔ
-اﺳﻢ اﻟﺪاﻟﺔ ﺑﺴﻴﻄﺔ ﻓﻲ اﻟﺪاﻟﺔ ،واﻟﺸﻜﺮ ﻣﻮﺻﻮل ﻟﺘﻠﻚ اﻻﻗﻮاس اﳌﻌﻘﻮﻓﺔ.
-ﻗﻴﻤﺔ وﺗﺮﺗﻴﺐ اﳌﻌﺎﻣﻼت واﳌﻌﻄﻴﺎت واﻧﻮاﻋﻬﺎ اﳌﺴﺘﺨﺪﻣﺔ ][12
)float rectangleArea(float length, float width
-ﻧﻮع اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة/اﳌﺴﺘﺮﺟﻌﺔ ﻣﻦ ﺗﻠﻚ اﻟﺪاﻟﺔ )ﻗﻴﻤﺔ ﻧﺎﰋ {
اﺣﺘﺴﺎب ﻣﺴﺎﺣﺔ ﺳﻄﺢ ﻣﺴﺘﻄﻴﻞ ﻣﺜﻼ( ،وﻧﻮع اﻟﻨﺎﰋ ﻋﺪدي }
;)return (length * width
ﺻﺤﻴﺢ أو ﻛﺴﺮي
ﻛﻤﺎ ﺗﺮى ﻓﻲ ﺣﺎﻻت ﺑﺴﻴﻄﺔ ﻣﺜﻞ ﻫﺬﻩ اﳊﺎﻟﺔ ﻣﻦ اﳌﻤﻜﻦ ان ﲡﺪ إﻳﻌﺎز
ﻓﻲ ﻣﺜﺎﻟﻨﺎ اﻟﺴﺎﺑﻖ ﺗﺮدك اﻻﺟﺎﺑﺎت ﺗﺒﺎﻋ َﺎ ﻛﻤﺎ ﻳﻠﻲ: واﺣﺪﺗﻘﻮمﻋﻠﻴﻪﺑﻨﻴﺔاﻟﺪاﻟﺔ ،وذﻟﻚ ﻻﺟﺮاءﻋﻤﻠﻴﺘﻲ اﳊﺴﺎبواﻻرﺳﺎل
اﻟﺪاﻟﺔ rectangleArea -اﺳﻢ دﻓﻌﺔ واﺣﺪة .ﻟﻘﺪ اﺳﺘﺨﺪﻣﻨﺎ ﻣﺘﻐﻴﺮ theAreaدون ﺣﺎﺟﺔ ﻓﻌﻠﻴﺔ ﻟﻪ إﻻ
٢٣
اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٢٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ
٢٥
اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﺣﺮوف ﲢﺘﻮي ﻓﺮاغ واﺣﺪ ،single spaceﻟﺬا ﻗﻴﻤﺘﻬﺎ ﺗﺴﺎوي .١ ﺳﻴﻘﻮم اﻻﻳﻌﺎز ﻓﻲ اﳌﺜﺎل ] [1ﺑﺎﺧﺮاج اﻟﻨﺺ اﻟﺘﺎﻟﻲ .
ﻫﺬﻩ اﻟﺴﻼﺳﻞ ﺗﺴﺘﺨﺪم ﺑﻀﻊ ﺣﺮوف ﻣﻦ اﻟﺮﻣﻮز اﳌﺘﺘﺎﻟﻴﺔ وﻫﻲ ”“Julia is a pretty actress.
ﺗﺴﺘﺨﺪم ﳌﻬﺎم ﻣﻌﻴﻨﺔ داﺧﻞ ﺳﻼﺳﻞ اﳊﺮوف .ﻛﻤﺜﺎل ﻋﻠﻰ ذﻟﻚ ان ﻛﺎﻓﺔ اﻟﻨﺼﻮص ﻣﺎﺑﲔ ﻋﻼﻣﺘﻲ اﻟﺘﻨﺼﻴﺺ “ ” ...ذات اﻟﺒﺎدﺋﺔ
اﺳﺘﺨﺪام اﳊﺮف \nﻻﺟﺒﺎر اﻟﺴﻠﺴﻠﺔ أن ﺗﻌﺮض ﺳﻠﺴﻠﺔ ﺣﺮوﻓﻬﺎ @ ﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ اﺳﻢ )ﺳﻠﺴﺔ اﳊﺮوف .(stringوﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ
ﺑﺴﻄﺮ ﺟﺪﻳﺪ .ﻫﺬا اﻟﺘﺮﻣﻴﺰ اﺧﺘﺼﺎر ﻟﻜﻠﻤﺔ .new line character اﻟﻨﺺ ذاﺗﻪ ،ﳝﻜﻦ ﻟﺪاﻟﺔ )( NSLogان ﺗﻄﺒﻊ ﻋﺪة ﻣﻌﻠﻮﻣﺎت اﺿﺎﻓﻴﺔ،
][3 ﻛﺎﻟﺘﺎرﻳﺦ اﳊﺎﻟﻲ واﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻘﺎﺋﻢ .ﻛﻤﺜﺎل ،ﻣﺨﺮﺟﺎت ﻫﺬﻩ
;)”NSLog(@”Julia is a pretty \nactress.
اﻟﺪاﻟﺔ اﻟﻜﺎﻣﻠﺔ ﻋﻠﻰ ﻧﻈﺎﻣﻲ ﺳﺘﻜﻮن:
اﻻن ﺳﻴﻜﻮن اﳋﺮج ﻛﻤﺎ ﻳﻠﻲ -ﻣﻊ اﻟﺘﺮﻛﻴﺰ ﻋﻠﻰ ﻣﺎ ﻳﻬﻤﻨﺎ ﻓﻘﻂ-
2005-12-22 17:39:23.084 test[399] Julia is
Julia is a pretty
actress. a pretty actress.
escape ان اﳋﻂ اﳌﺎﺋﻞ "\" ﺑﺎﳌﺜﺎل] [3.1ﻳﺪﻋﻰ ﺗﺮﻣﻴﺰ ﻫﺮوب ﳝﻜﻦ ﻟﺴﻠﺴﻠﺔ اﳊﺮوف اﻟﻨﺼﻴﺔ ﻫﺬﻩ ان ﺗﻜﻮن ﺑﻘﻴﻤﺔ ﺻﻔﺮ أو اﻛﺜﺮ.
characterوﻫﻮ ﻳﺴﺘﺨﺪم ﻻﻋﻼم اﻟﺪاﻟﺔ )( NSLogﺑﺄن اﳊﺮف اﻟﺘﺎﻟﻲ ﻣﻠﺤﻮﻇﺔ :اﻻﻣﺜﻠﺔ اﻟﺘﺎﻟﻴﺔ ﺗﻌﺮض اﻟﺪوال اﻻﻛﺜﺮ اﻫﻤﻴﺔ دون ﻋﺮض
ﻓﻲ اﻟﺴﻠﺴﻠﺔ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻌﺮض ،إن اﳊﺮف اﳋﺎص اﻟﻐﻴﺮ ﻣﻌﺮوض ﻟﻠﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainﻛﻤﺎ ﻳﻠﻲ.
ﻓﻲ ﻫﺬا اﳌﺜﺎل ﻫﻮ ” “nوﻫﻮ ﻳﻌﻨﻲ ﻟﻠﺪاﻟﺔ ﻋﺮض ﻣﺎﻳﻠﻲ ﻣﻦ ﺣﺮوف ][2
;)””@(NSLog
اﻟﺴﻠﺴﻠﺔ ﺑﺴﻄﺮ ﺟﺪﻳﺪ. ;)“ ”@(NSLog
ﻓﻲ ﺣﺎﻻت ﻧﺎدرة ﻗﺪ ﺗﺮﻏﺐ ﺑﻄﺒﺎﻋﺔ ﻫﺬا اﳋﻂ اﳌﺎﺋﻞ "\" ﺑﺎﻟﺬات ان اﻻﻳﻌﺎز ﺑﺎﻟﺴﻄﺮ ] [2.1ﻳﺤﺘﻮي ﺳﻠﺴﻠﺔ ﺣﺮوف ﻣﺤﺘﻮاﻫﺎ ﻳﺴﺎوي
ﻋﻠﻰ اﻟﺸﺎﺷﺔ ،ﻓﻤﺎ ﻫﻮ اﻟﻌﻤﻞ؟ ﻗﻴﻤﺔ ﺻﻔﺮ وﻫﻲ ﺗﺪﻋﻰ ﺳﻠﺴﻠﺔ ﺣﺮوف ﻓﺎرﻏﺔ ) empty stringاي
ان ﻃﻮﻟﻬﺎ ﻳﺴﺎوي ﺻﻔﺮ( .اﻻﻳﻌﺎز ﺑﺎﻟﺴﻄﺮ ] [2.2ﻻ ﻳﺮى ان ﺳﻠﺴﻠﺔ
ﳝﻜﻨﻚ ﺗﻜﺮار وﺿﻊ اﳋﻂ اﳌﺎﺋﻞ ﺧﻠﻒ )او اﻣﺎم( ذﻟﻚ اﳋﻂ اﳌﺎﺋﻞ
اﳊﺮوف ﻓﺎرﻏﺔ -ﺑﺎﻟﺮﻏﻢ ﻣﻦ ان ﺷﻜﻠﻬﺎ ﻛﺬﻟﻚ -ﺑﻞ ﻳﺮاﻫﺎ ﺳﻠﺴﻠﺔ
٢٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ
، integerToDisplayان ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻳﻌﻄﻲ اﻟﻨﺘﻴﺠﺔ اﻟﺘﺎﻟﻴﺔ. -اي ﺗﻜﺮرﻩ ﻣﺮﺗﺎن .-ﻫﺬا اﻻﻳﻌﺎز ﻳﺨﺒﺮ اﻟﺪاﻟﺔ )( NSLogان اﳊﺮف
The value of the integer is 6. اﻟﺘﺎﻟﻲ ﻣﻦ اﳋﻂ اﳌﺎﺋﻞ ﻣﻄﻠﻮب ﻟﻠﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ وان اي ﺣﺮف
%f وﻟﻌﺮض ﻋﺪد ﻣﻦ ﻧﻮع ﻛﺴﺮي ،ﻳﺠﺐ اﺳﺘﺨﺪام اﳊﺮف اﳋﺎص ﺧﺎص آﺧﺮ ﺳﻴﻜﻮن ﻗﻴﺪ اﻻﻫﻤﺎل .ﻫﻨﺎ ﻣﺜﺎل:
َ
ﺑﺪﻻ ﻣﻦ .%d ][4
;)”NSLog(@”Julia is a pretty actress.\\n
][6
;float x, floatToDisplay اﻟﺒﻴﺎن اﻟﺴﺎﺑﻖ ﻳﻌﺮض ﻣﺎ ﻳﻠﻲ ﻋﻠﻰ اﻟﺸﺎﺷﺔ.
;x = 12345.09876
Julia is a pretty actress.\n
;floatToDisplay = x/3.1416
NSLog(@”The value of the float is %f.”,
;)floatToDisplay
ﺣﺘﻰ اﻻن ﻗﻤﻨﺎ ﺑﺎﺳﺘﻌﺮض اﻟﺴﻼﺳﻞ اﻟﺜﺎﺑﺘﺔ ،دﻋﻨﺎ ﻧﻄﺒﻊ اﻟﻘﻴﻢ اﻟﻨﺎﲡﺔ
ﻣﻦ ﺣﺴﺎﺑﺘﻨﺎ اﻟﻰ اﻟﺸﺎﺷﺔ.
ﻟﺘﺤﺪﻳﺪ دﻗﺔ ﻋﺮض اﻟﻌﺪد اﻟﻜﺴﺮي ﻳﻌﻮد ﻟﻚ اﻻﻣﺮ ﻓﻲ ﲢﺪﻳﺪ ﻋﺪد ][5
اﳋﺎﻧﺎت اﳌﺘﺎﺣﺔ ﺑﻌﺪ اﻟﻔﺎﺻﻠﺔ .ﻓﻠﻌﺮض ﺧﺎﻧﺘﲔ ﺑﻌﺪ اﻟﻔﺎﺻﻠﺔ ادرج ;int x, integerToDisplay
رﻗﻢ ٢ﻣﺎﺑﲔ اﻟﻌﻼﻣﺔ اﳌﺌﻮﻳﺔ ورﻣﺰ اﻟﻜﺴﺮ .f ;x = 1
;integerToDisplay = 5 + x
][7 NSLog(@”The value of the integer is %d.”,
;float x, floatToDisplay ;)integerToDisplay
;x = 12345.09876
;floatToDisplay = x/3.1416
ﻻﺣﻆ وﺟﻮد ﻛﻞ ﻣﻦ :ﺳﻠﺴﻠﺔ ﺣﺮوف ،ﻓﺎﺻﻠﺔ واﺳﻢ ﻣﺘﻐﻴﺮ ﻣﺎﺑﲔ
NSLog(@”The value of the float is %.2f.”, اﻻﻗﻮاس .ﻟﻘﺪ اﺣﺘﻮت ﺳﻠﺴﻠﺔ اﳊﺮوف ﻋﻠﻰ رﻣﺰ ﻋﺠﻴﺐ :%dاﻧﻪ
;)floatToDisplay
رﻣﺰ ﺧﺎص ﻛﺎﳋﻂ اﳌﺎﺋﻞ ،ﻓﻌﻼﻣﺔ اﻟﻨﺴﺒﺔ اﳌﺌﻮﻳﺔ وﺣﺮف dﲤﺜﻞ ﺣﺮف
ﻗﺪ ﺗﺮﻏﺐ ﺑﺎﻧﺸﺎء ﺟﺪول ﻟﻠﻘﻴﻢ ﻣﻊ اﳊﺴﺎﺑﺎت اﳌﺘﻜﺮرة .ﺗﺨﻴﻞ ﻣﻦ اﳊﺮوف اﳋﺎﺻﺔ ﻟﻠﺪاﻟﺔ .ﻋﻨﺪ إرﻓﺎق اﻟﺮﻣﺰ اﳌﺌﻮي ﺑﺤﺮف ) dوﻫﻮ
ﺟﺪول ﻟﻠﺘﺤﻮﻳﻞ ﻣﺎﺑﲔ ﻣﻌﻄﻴﺎت درﺟﺎت اﳊﺮارة ﺑﺎﻟﺪرﺟﺔ اﳌﺌﻮﻳﺔ اﺧﺘﺼﺎراَ ﻟﻨﻮع decimal numberاﻟﻌﺪدي( ،اﺛﻨﺎء ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ
وﻣﺎ ﻳﻘﺎﺑﻠﻬﺎ ﺑﺎﻟﻔﻬﺮﻧﻬﺎﻳﺖ. ﺳﻴﺘﻢ اﺳﺘﺒﺪال ذﻟﻚ اﳊﺮف ﺑﺎﻟﻘﻴﻤﺔ اﻟﺘﻲ ﻳﺪل ﻋﻠﻴﻬﺎ ذﻟﻚ اﳌﺘﻐﻴﺮ
٢٧
اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
رؤﻳﺔ ﻋﺮض اﳌﺴﺎﻓﺎت اﳌﺘﺎﺣﺔ ﻟﻼﻋﺪاد واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ ﺣﺠﺰ زاﺋﺪ اذا اردت ﻋﺮض اﻟﻘﻴﻢ ﺑﺸﻜﻞ ﺻﺤﻴﺢ وﻣﺮﺗﺐ ﻋﻠﻴﻚ ﻋﺮض
ﻋﻦ ﻣﺴﺎﺣﺔ اﺣﺘﻮاء اﻟﻌﺪد.ﳝﻜﻨﻨﺎ اﻳﻀ َﺎ ﺗﻀﻤﲔ ﻣﻮاﺻﻔﺎت ﻣﺴﺎﻓﺔ اﻟﺒﻴﺎﻧﺎت ﺿﻤﻦ ﻋﻤﻮد ﻋﺮﺿﻪ ﺛﺎﺑﺖ .وﳝﻜﻨﻚ ﲢﺪﻳﺪ اﻟﻌﺮض ﻣﻦ
اﻟﻌﺮض ﻣﻊ اﻻﻋﺪاد اﻟﻜﺴﺮﻳﺔ. ﺧﻼل اﺳﺘﺨﺪام اﻟﻘﻴﻢ ﻣﻦ ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ integerوذﻟﻚ ﺑﺎدراج
][9 اﻟﻌﺪد ﻣﺎﺑﲔ اﻟﻌﻼﻣﺔ اﳌﺌﻮﻳﺔ ٪وﺣﺮف اﻟﻜﺴﺮ ) fاو اﻟﻌﻼﻣﺔ اﳌﺌﻮﻳﺔ ٪
float x=1234.5678
NSLog(@”Reserve a space of 10, and show 2
وﺣﺮف (dﻋﻠﻰ ﻛﻞ ﻓﻲ ﺣﺎل ﻛﺎن اﻟﻌﺮض اﳌﺴﻨﺪ اﺻﻐﺮ ﻣﻦ اﻟﻌﺮض
;”significant digits. اﳌﺘﺎح ﻟﻠﺮﻗﻢ اﻟﻜﺴﺮي ،ﻋﻨﺪﻫﺎ ﺗﻜﻮن اﻻوﻟﻮﻳﺔ ﻟﻠﻌﺪد اﳌﺴﻨﺪ.
;)NSLog(@”%10.2d”, x
][8
;int x = 123456
وﺑﺎﻟﺘﺄﻛﻴﺪ ﳝﻜﻦ ﻋﺮض اﻛﺜﺮ ﻣﻦ ﻗﻴﻤﺔ واﺣﺪة ،أو ﺧﻠﻴﻂ ﻣﻦ اﻟﻘﻴﻢ ;)NSLog(@”%2d”, x
;)NSLog(@”%4d”, x
اﳌﺘﻨﻮﻋﺔ.و ﻳﺠﺐ ﻋﻠﻴﻚ ﻋﻨﺪﻫﺎ ﲢﺪﻳﺪ اﻟﺼﻨﻒ اﻟﺼﺤﻴﺢ ﻟﻠﻘﻴﻢ - ;)NSLog(@”%6d”, x
ﺳﻮاء ﻛﺎﻧﺖ ﺻﺤﻴﺤﺔ intأو ﻛﺴﺮﻳﺔ -floatﺑﺎﺳﺘﺨﺪام اﳊﺮوف ;)NSLog(@”%8d”, x
اﳋﺎﺻﺔ %dو.%f
][10
اﻟﺴﺎﺑﻖ ﻳﻌﻄﻲ اﳋﺮج اﻟﺘﺎﻟﻲ: اﳌﺜﺎل][8
;int x = 8 123456
;float pi = 3.1416 123456
NSLog(@”The integer value is %d, whereas 123456
;)the float value is %f.”, x, pi 123456
ﻣﻦ اﻟﻀﺮوري اﺳﺘﺨﺪام اﻟﺮﻣﺰ اﻟﺼﺤﻴﺢ ﻣﻊ ﻧﻮع ﺻﻨﻒ اﳌﺘﻐﻴﺮ، ان اﻻﻳﻌﺎزان ] [8.1, 8.2ﻳﺴﻨﺪﻧﺎن ﻣﺴﺎﺣﺎت ﻗﻠﻴﻠﺔ ﻣﻦ اﳋﺎﻧﺎت اﳌﺘﺎﺣﺔ
اﳌﺠﻤﻊ ﻟﻠﻘﻴﻤﺔ اﻻوﻟﻰ ﻓﺈﻧﻚ ﻟﻦ ﺗﻨﺠﻮ ﻓﻲ ﺣﺎل ﻗﻴﺎﻣﻚ ﺑﺈﺳﺘﻐﻔﺎل ّ ﻟﻼﻋﺪاد اﳌﻌﺮوﺿﺔ ،وﻟﻜﻦ اﳌﺴﺎﺣﺔ اﳌﺘﺎﺣﺔ ﻣﺄﺧﻮذة ﻋﻠﻰ ﻛﻞ ﺣﺎل.
ﻣﺤﺎوﻟﺘﻚ ﺣﻴﺚ ﺳﻨﻌﺮض اﻟﻘﻴﻤﺔ اﻟﺘﺎﻟﻴﺔ ﻟﻌﺪم اﻟﻌﺮض .ﻛﻤﺜﺎل، ﻓﻘﻂ اﻻﻳﻌﺎز ] [8.4ﻳﺴﻨﺪ ﻣﺴﺎﺣﺔ اﻋﺮض ﻣﻦ اﻟﻘﻴﻤﺔ ،ﻟﺬا ﳝﻜﻨﻨﺎ
٢٨
Xcode ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ
[11] [10b]
#import <Foundation/Foundation.h> int x = 8;
float circleArea(float theRadius); float pi = 3.1416;
float rectangleArea(float width, float NSLog(@”The integer value is %f, whereas
the float value is %f.”, x, pi);
height);
٢٩
اﻟﻄﺒﺎﻋﺔ ﻋﻠﻰ اﻟﺸﺎﺷﺔ Xcode ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ
٣٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
٣١
ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻧﺮﻏﺐ ﺣﺎﻟﻴ َﺎ ﺑﺎﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﺑﺴﻴﻂ ﺟﺪاَ ﻣﺴﺘﺨﺪﻣﲔ ، Objective-C ﻟﺘﺒﺪء ﻓﻌﻠﻴ َﺎ ،اﺧﺘﺮ ﻣﺸﺮوع ﺟﺪﻳﺪ New Projectﻣﻦ ﻗﺎﺋﻤﺔ ﻣﻠﻒ
)دون اﻟﺘﻄﺮق ﻻﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺒﺮﻣﺠﺔ اﻟﺮﺳﻮﻣﻴﺔ (GUIﻟﺬا ﺗﻮﺟﺔ File menuواﻟﺘﻲ ﺗﻮﺟﺪ ﺑﺄﻋﻠﻰ اﻟﺸﺎﺷﺔ .ﺳﻴﻈﻬﺮ ﻟﻚ ﺻﻨﺪوق
ادﻧﻰ اﻟﻘﺎﺋﻤﺔ واﺧﺘﺮ ”اداة اﺳﺎﺳﻴﺔ ” Foundation Toolﺣﻴﺚ ﲡﺪﻫﺎ ﺣﻮار ﺳﺎرداَ ﻻﺋﺤﺔ واﻓﻴﺔ ﺑﺨﻴﺎرات اﳌﺸﺎرﻳﻊ اﻟﺘﻲ ﳝﻜﻨﻚ اﻻﻧﻄﻼق
داﺧﻞ ﻣﺼﻨﻒ ادوات ﺳﻄﺮ اﻻواﻣﺮ .Command Line Utility ﻣﻨﻬﺎ ﻟﺘﻄﻮﻳﺮ ﻣﺸﺮوﻋﻚ. .
٣٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
ﻫﺬﻩ اﳌﻠﻔﺎت ّﲡﻤﻊ وﲢﻔﻆ داﺧﻞ اﻻﻃﺎر ﲟﺠﻠﺪات اﻓﺘﺮاﺿﻴﺔ ،ﻓﻤﺎ ﺳﻄﺮ اﻻواﻣﺮ ﻛﺎﺳﻠﻮب ﺗﻔﺎﻋﻠﻲ ﻣﻊ اﳊﺎﺳﺐ .وﺣﺘﻰ ﺗﺘﺠﻨﺐ ﺑﻌﺾ
ان ﺗﻘﻮم ﺑﻌﻤﻠﻴﺔ ﺗﺼﻔﺢ ﻣﻦ ﺧﻼل ﺑﺮﻧﺎﻣﺞ ) (Finderاﻟﺬي ﻳﻘﻮم اﻟﻌﻮاﺋﻖ ﻗﻢ ﺑﺎﺧﺘﻴﺎر اﺳﻢ ﻣﻦ ﻛﻠﻤﺔ واﺣﺪة ﳌﺸﺮوﻋﻚ.
ﺑﺘﺼﻔﺢ وادارة اﳌﻠﻔﺎت ﻋﻠﻰ اﻟﻘﺮص اﻟﺼﻠﺐ ﳉﻬﺎز اﳌﺎﻛﻨﺘﻮش،
ﺗﺸﻐﻞ ﻣﻦان ﻣﻦ اﳌﺘﻌﺎرف ﻋﻠﻴﻪ ﺗﺴﻤﻴﺔ ﻣﻠﻔﺎت اﻷدوات اﻟﺘﻲ ّ
ﺳﺘﺠﺪ ان ﺗﻠﻚ اﳌﻠﻔﺎت ﺟﻤﻴﻌﻬﺎ ﻣﺤﻔﻮﻇﺔ ﻋﻠﻰ ﻣﺴﺘﻮى ﺟﺬري
ﺧﻼل اﻟﻮﺣﺪات اﻟﻄﺮﻓﻴﺔ ﺑﺎﺳﻤﺎء ﻳﻜﻮن ﺣﺮﻓﻬﺎ اﻻول ﺻﻐﻴﺮ.
واﺣﺪ Flat Levelداﺧﻞ ﻣﺠﻠﺪ ﻣﺸﺮوﻋﻚ Xcode .ﻳﻮﻓﺮ ﻟﻚ
ﺑﻴﻨﻤﺎ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ّ
ﺗﺸﻐﻞ ﻣﻦ ﺧﻼل اﻟﻮاﺟﻬﺔ اﻟﺮﺳﻮﻣﻴﺔ ﺑﺎﺳﻤﺎء
ﻣﻴﺰة اﻟﺘﺮﺗﻴﺐ اﻻﻓﺘﺮاﺿﻲ ﻣﻦ ﺧﻼل ﻓﻜﺮة اﳌﺠﻤﻮﻋﺎت ”“groups
ﺣﺮﻓﻬﺎ اﻻول ﻛﺒﻴﺮ.
واﻟﻬﺪف ﻣﻨﻬﺎ ﺗﻨﻈﻴﻤﻲ ﺑﺤﺖ.
ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ ﻣﺠﻤﻮﻋﺔ اﳌﺼﺎدر اﳌﺴﻤﺎة ” “Sourceواﻟﺘﻲ ﺗﻮاﺟﻬﻚ ﻧﺎﻓﺬة ﺣﺎﻟﻴ َﺎ ،ﺳﺘﺮاﻫﺎ ﻛﺜﻴﺮاَ ﻣﺎ دﻣﺖ ﺑﺤﻘﻞ اﻟﺒﺮﻣﺠﺔ .ﻫﺬﻩ
ﺳﺘﺠﺪﻫﺎ ﺑﺎﻻﻃﺎر اﻻﻳﺴﺮ ﺣﻴﺚ ﺗﻮﺟﺪ اﳌﻠﻔﺎت واﳌﺠﻠﺪات .داﺧﻞ اﻟﻨﺎﻓﺬة ﻣﻜﻮﻧﺔ ﻣﻦ اﻃﺎرﻳﻦ )ﻗﻄﺎﻋﲔ(.
ﻫﺬا اﳌﺠﻠﺪ ﺳﺘﺠﺪ ﻣﻠﻒ -ﻣﺴﻤﻰ ﺑﺎﺳﻢ ﻣﺸﺮوﻋﻚ -وﻫﻮ ﻫﻨﺎ ﳝﺜﻞ اﻻﻃﺎر اﻻﻳﺴﺮ ﻓﻴﻬﺎ ﻋﺮض ﳌﺎ ﻟﺪﻳﻚ ﻣﻦ ﻣﻠﻔﺎت وﻣﺠﻤﻮﻋﺎت
justry.mوﻫﻞ ﺗﺘﺬﻛﺮ ﻛﻴﻒ ان ﻛﻞ ﺑﺮﻧﺎﻣﺞ ﻳﺘﻄﻠﺐ وﺟﻮد داﻟﺔ وذﻟﻚ ﻟﺘﻤﻜﻴﻨﻚ ﻣﻦ اﻟﻨﻔﺎذ اﻟﻰ ﻛﺎﻓﺔ اﳌﻠﻔﺎت اﳌﺴﺎﻫﻤﺔ ﻓﻲ ﺗﻜﻮﻳﻦ
رﺋﻴﺴﺔ ﺑﺈﺳﻢ )( main؟ ﻓﻲ اﳊﻘﻴﻘﺔ ذﻟﻚ ﻫﻮ اﳌﻠﻒ اﶈﺘﻮي ﻟﻠﺪاﻟﺔ ﺑﺮﻧﺎﻣﺠﻚ .ﺣﺎﻟﻴ َﺎ ﻻ ﻳﻮﺟﺪ ﻣﻠﻔﺎت ﻛﺜﻴﺮة.
اﻟﺮﺋﻴﺴﺔ.
ﻓﻲ اﳌﺴﺘﻘﺒﻞ وﻣﻊ ﺗﻌﺎﻣﻠﻚ ﻣﻊ اﻟﻮاﺟﻬﺔ اﻟﺮﺳﻮﻣﻴﺔ ﺳﺘﺠﺪ اﻟﻌﺪﻳﺪ
ﺳﻨﻘﻮم ﻻﺣﻘ َﺎ ﺧﻼل ﻫﺬا اﻟﻔﺼﻞ ﺑﺎﺟﺮاء ﺗﻌﺪﻳﻼت ﻋﻠﻰ اﳌﻠﻒ ﺣﻴﺚ
ﻣﻦ اﳌﻠﻔﺎت ﻫﻨﺎ.
ﺳﻴﺸﻤﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ ﻳﺘﻜﻮن ﻣﻨﻬﺎ ﺑﺮﻧﺎﻣﺠﻨﺎ .اذا ﻗﻤﺖ
ﺑﻔﺘﺢ اﳌﻠﻒ اﳌﺴﻤﻰ justatry.mوذﻟﻚ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻳﻘﻮﻧﺔ اﳌﻠﻒ ُﻳﻌﺪ اﻻﻃﺎر اﻻﻳﺴﺮ اﳌﻨﻈﻢ اﻟﺬي ﻳﻌﺮض ﻟﻚ ﻣﺼﺎدر اﳌﻠﻔﺎت ﺣﻴﺚ
ﻋﻨﺪﻫﺎ ﺳﺘﺠﺪ ﻣﻔﺎﺟﺄة ﺳﻌﻴﺪة ﺑﺎﻧﺘﻈﺎرك .ﻓﻘﺪ ﻗﺎﻣﺖ أﭘﻞ ﺑﻜﺘﺎﺑﺔ ﻳﻌﻴﻨﻚ ﻋﻠﻰ ﺗﺼﻨﻴﻔﻬﺎ وﲡﻤﻴﻌﻬﺎ .ﺳﻮاء اﺳﺘﺨﺪﻣﺖ اﻟﻮاﺟﻬﺔ
اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainﺑﺎﻟﻨﻴﺎﺑﺔ ﻋﻨﻚ. اﻟﺮﺳﻮﻣﻴﺔ أو اﻟﻠﻐﺎت اﻻﺧﺮى اﳌﺘﺎﺣﺔ ﻗﻴﺪ اﻟﺘﻌﺎﻣﻞ.
٣٣
ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
][1
>#import <Foundation/Foundation.h
int main (int argc, const char * argv[]) //
][1.3
{
= NSAutoreleasePool * pool
][[NSAutoreleasePool alloc] init]; // [1.5
// insert code here...
;)”!NSLog(@”Hello, World
][pool release]; //[1.9
;return 0
}
٣٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
اﳌﻜﺎﺳﺐاﳉﻴﺪة ﻫﻨﺎ،ﻫﻲواﻗﻊاﻧﺘﻬﺎﺋﻚﻣﻦﻗﺮاءةﻓﺼﻠﲔﻣﻦاﻛﺜﺮ اﻟﻔﺼﻮل -ﻣﻌﺎﻣﻼت ﻏﺮﻳﺒﺔ اﻟﺸﻜﻞ ][،int argc, const char * argv
ﺻﻌﻮﺑﺔ ﺑﻬﺬا اﻟﻜﺘﺎب ،واﻧﻚ ﻣﻘﺒﻞ ﻋﻠﻰ ﺛﻼﺛﺔ ﻓﺼﻮل ﺳﻬﻠﺔ ﻧﺴﺒﻴ َﺎ ﻗﺒﻞ ﻣﺤﺼﻮرة ﺑﲔ اﻗﻮاس اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ ].main() [1.3
ان ﻧﺘﻮاﺟﻪ ﻣﺮة اﺧﺮى ﻣﻊ اﻣﻮر ﺗﺘﻄﻠﺐ ﻗﺪراَ ﻣﻦ اﻟﺘﺮﻛﻴﺰ اﻟﻨﺴﺒﻲ. NSAutoreleasePool -اﻳﻌﺎز ﺑﺪء ﻋﻤﻞ ﻟﺪاﻟﺔ ﻏﺮﻳﺒﺔ اﺳﻤﻬﺎ
ﺑﺎﻟﺴﻄﺮ ].[1.5
ﻓﻲ ﺣﺎل ﻋﺪم رﻏﺒﺘﻚ ﲟﻐﺎدرة ﻫﺬا اﳉﺰء اﻻ ﺑﻮﺟﻮد ﺗﻔﺴﻴﺮ و releaseﺑﺎﻟﺴﻄﺮ ]. [1.9 ﻛﻠﻤﺘﻲ pool -اﻳﻌﺎز آﺧﺮ ﻳﺤﺘﻮي
ﺣﻮل ﻣﺎ ﺳﺒﻖ ،ﻟﻴﻜﻦ ﻟﺪﻳﻚ ﻫﺬا اﻟﺘﻔﺴﻴﺮ اﳌﻘﺘﻀﺐ: ﺷﺨﺼﻴ َﺎ اﺷﻌﺮ ﺑﻌﺪم اﻟﺮﺿﺎ ﻋﻨﺪﻣﺎ ﻳﻘﻮم ﻣﺆﻟﻔﻲ اﻟﻜﺘﺐ ﺑﻘﺬﻓﻲ
إن ﻣﻌﺎﻣﻼت اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ mainﻣﻄﻠﻮﺑﺔ ﻣﺘﻰ ﰎ ﺗﺸﻐﻴﻞ ﲟﺠﻤﻮﻋﺔ ﻛﺒﻴﺮة ﻣﻦ اﻟﺮﻣﻮز اﻟﻐﻴﺮ ﻣﺄﻟﻮﻓﺔ ﻣﻊ وﻋﺪ ﻗﺎﻃﻊ ﺑﺎﻧﻬﺎ ﺳﺘﻜﻮن
اﻟﺒﺮﻧﺎﻣﺞ ﻣﻦ ﺧﻼل اﻟﻮﺣﺪة اﻟﻄﺮﻓﻴﺔ . Terminalوﺑﺮﻧﺎﻣﺠﻚ ﻣﻔﻬﻮﻣﺔ وﻣﺄﻟﻮﻓﺔ ﺑﻌﺪ ﻓﺘﺮة .ﻟﺬﻟﻚ ﻛﻤﺎ ﺗﺮى ارﺗﺄﻳﻨﺎ ﺗﻌﺮﻳﻔﻚ ﲟﻔﻬﻮم
ﻛﺎي ﺑﺮﻧﺎﻣﺞ اﺧﺮ ﻳﺘﻄﻠﺐ ﺣﺠﺰ ﻗﺪراَ ﻣﻦ اﻟﺬاﻛﺮة اﳌﺘﺎﺣﺔ ،ذﻟﻚ اﻟﺪوال وﺟﻌﻠﻨﺎﻩ ﻣﻮﺿﻮﻋ َﺎ ﻣﺄﻟﻮﻓ َﺎ ﻗﺒﻞ اﳋﻮض ﺑﻐﻤﺎر اﻟﺘﻌﺮﻳﻔﺎت
اﻟﻘﺪر اﻟﺬي ﺳﺘﺮﻏﺐ اﻟﺒﺮاﻣﺞ اﻻﺧﺮى ﺑﺤﺠﺰﻫﺎ ﻟﻨﻔﺴﻬﺎ ﻓﻮر اﻻﺧﺮى اﻟﺘﻲ ﻗﺪ ﺗﺸﻜﻞ ﺻﻌﻮﺑﺔ ﻓﻲ اﻟﻔﻬﻢ.
اﻧﺘﻬﺎء ﺑﺮﻧﺎﻣﺠﻚ ﻣﻨﻬﺎ. ﻟﻘﺪ آﻟﻔﺖ ﻣﻔﻬﻮم اﻟﺪوال وﻣﺎ ﻫﻮ دورﻫﺎ ﻓﻲ ﺗﻨﻈﻴﻢ ﺗﺮﻛﻴﺐ اﺟﺰاء
وﻣﻦ واﺟﺒﻚ ﻛﻤﺒﺮﻣﺞ ،اﻟﻘﻴﺎم ﺑﺤﺠﺰ ذﻟﻚ اﻟﻘﺪر ﻣﻦ اﻟﺬاﻛﺮة اﻟﺒﺮﻧﺎﻣﺞ ،وﻛﻴﻒ ان اي ﺑﺮﻧﺎﻣﺞ ﻳﺤﺘﻮي داﻟﺔ رﺋﻴﺴﺔ ﻫﻲ )(، main
اﻟﺘﻲ ﻳﺤﺘﺎﺟﻬﺎ ﺑﺮﻧﺎﻣﺠﻚ ،وﻳﺘﺮﺗﺐ ﻋﻠﻴﻚ اﻳﻀ َﺎ ﻣﻬﻤﺔ ارﺟﺎﻋﻬﺎ ﻋﻠﻰ اﻻﻋﺘﺮاف ﺑﺎﻧﻪ ﻻ ﳝﻜﻨﻨﻲ
وﻛﻴﻒ ﻫﻮ ﺷﻜﻞ ﻫﺬﻩ اﻟﺪوال .وﻟﻜﻦ ّ
ﻟﻠﻨﻈﺎم ﻓﻮر اﻧﺘﻬﺎﺋﻚ ﻣﻨﻬﺎ ﺣﺘﻰ ﻳﺘﻴﺤﻬﺎ ﳌﻦ ﻳﺮﻏﺐ ﺑﺎﺳﺘﺨﺪاﻣﻬﺎ. ﺷﺮح ﻛﻞ ﺗﺮاﻩ ﺑﺎﳌﺜﺎل رﻗﻢ ] [1ﺣﺎﻟﻴ َﺎ ﻋﻠﻰ اﻻﻗﻞ.
ذﻟﻚ ﻣﺎ ﻳﻘﻮم ﺑﻪ اﻻﻳﻌﺎزان اﻟﻠﺬان ﻳﺤﺘﻮﻳﺎن ﻛﻠﻤﺔ ”“pool ﻟﺬا آﻣﻞ ﻣﻨﻚ اﳌﻌﺬرة ﺣﻴﺚ ﺳﺎﻃﻠﺐ ﻣﻨﻚ ﲡﺎﻫﻞ اﻻﻳﻌﺎزات اﻟﻐﻴﺮ
داﺧﻠﻬﻤﺎ. ﻣﺄﻟﻮﻓﺔ ﻟﺪﻳﻚ )اﻋﻨﻲ ﺑﺬﻟﻚ ﻛﻞ ﻣﻦ ] ( [1.3, 1.5 , 1.9ﻓﻲ اﻟﻮﻗﺖ
اﳊﺎﻟﻲ .ﻓﻬﻨﺎك اﻣﻮر وﻣﻔﺎﻫﻴﻢ ﻋﺪﻳﺪة ﺗﺘﻄﻠﺐ ﻣﻨﻚ ان ﺗﺄﻟﻔﻬﺎ َ
اوﻻ ﺑـ
Objective-Cﳑﺎ ّ
ﳝﻜﻨﻚ ﻣﻦ ﻛﺘﺎﺑﺔ اﻟﺒﺮاﻣﺞ ﺑﺴﻬﻮﻟﺔ اﻛﺜﺮ .
٣٥
ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
][2
>#import <Foundation/Foundation.h دﻋﻨﺎ اﻻن ّ
ﻧﺸﻐﻞ اﻟﺒﺮﻧﺎﻣﺞ اﳌﻘﺪم اﻟﻴﻨﺎ ﻣﻦ
ﻗﺒﻞ أﭘﻞ ،ﻓﻲ اﳌﺜﺎل ] .[1اﺿﻐﻂ اﻻزرار
)][int main (int argc, const char * argv
{ ازرار Build
اﻟﺜﺎﻧﻲ اﻟﺬي ﻳﺤﺘﻮي ﺻﻮرة ﻣﻄﺮﻗﺔ وﻳﻈﻬﺮ
= NSAutoreleasePool * pool and Go اﺳﻢ Build،ﺑﺸﺰﻳﻂ اﻻدوات ،وﺗﻮﺟﻪ اﻟﻰ
;][[NSAutoreleasePool alloc] init
// insert code here... ﺑﻨﺪ compile buildوﺷﻐّﻞ اﻟﺒﺮﻧﺎﻣﺞ.
)”NSLog(@”Julia is a pretty actress //
!Whoops, forgot the semicolon
][pool release]; //[2.9 ﺳﻴﺘﻢ ّﲡﻤﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ ﺛﻢ ﺗﺸﻐﻴﻠﻪ ،وﺳﻴﺘﻢ ﻋﺮض اﻟﻨﺘﺎﺋﺞ داﺧﻞ اﻃﺎر
;return 0
} ﻧﺎﻓﺬة اﻟﺘﻮﺛﻴﻖ ، Run Log windowﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ﺑﻌﺾ اﳌﻌﻠﻮﻣﺎت
اﻻﺿﺎﻓﻴﺔ .إن آﺧﺮ ﺟﻤﻠﺔ ﺳﺘﻘﺮأﻫﺎ ﺗﻔﻴﺪ ﺧﺮوج اﻟﺒﺮﻧﺎﻣﺞ وﺗﻮﻗﻔﻪ ﻋﻦ
ﻟﺘﺠﻤﻴﻊ وﺑﻨﺎء ﻫﺬا اﻟﺒﺮﻧﺎﻣﺞ ،اﺿﻐﻂ اﻳﻘﻮﻧﺔ اﻟﺒﻨﺎء اﳌﻮﺟﻮدة ﺑﺸﺮﻳﻂ
ّ اﻟﻌﻤﻞ ﺑﻘﻴﻤﺔ ﻣﻘﺪارﻫﺎ ﺻﻔﺮ.
اﻷدوات .ﺳﺘﻈﻬﺮ ﻟﻚ داﺋﺮة ﺻﻐﻴﺮة ﺣﻤﺮاء اﻣﺎم اﻻﻳﻌﺎز ].[2.9
ﺗﻠﻚ اﻟﻘﻴﻤﺔ اﻟﺘﻲ اﻧﺘﺠﺘﻬﺎ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )(، mainواﻟﺘﻲ ﰎ ذﻛﺮﻫﺎ
ﺑﺎﻟﻔﺼﻞ اﻟﺜﺎﻟﺚ ] [7.9ﻟﺬا ﻣﻦ اﻟﻮاﺿﺢ ان ﺑﺮﻧﺎﻣﺠﻨﺎ ﻗﺪ ﻧﻔﺬ ﻛﺎﻓﺔ اﳌﻬﺎم
اﳌﺪرﺟﺔ ﻟﺪﻳﺔ ﺣﺘﻰ آﺧﺮ ﺳﻄﺮ ،وﻟﻢ ﻳﺘﻮﻗﻒ ﺑﺸﻜﻞ ﻣﺒﻜﺮ .ﺣﺘﻰ اﻻن
Xcodeﻳﺒﻠﻴﻐﻚ ﻋﻦ وﺟﻮد ﺧﻄﺎء اﻻﻣﻮر ﺗﺴﻴﺮ ﻋﻠﻰ ﻣﺎ ﻳﺮام!
اﻟﺘﺠﻤﻴﻊ ،ﻓﺘﻠﻚ
ﻟﻘﺪ ﻗﺎم Xcodeﺑﺘﺒﻠﻴﻐﻚ ﻋﻦ وﺟﻮد ﺧﻄﺎء اﺛﻨﺎء ّ ﻧﻌﻮد اﻟﻰ ﻣﺜﺎﻟﻨﺎ ] [1ﻟﻨﺮى ﻣﺎ ﺳﻴﺤﺪث ﻟﻮ ﻛﺎن ﻫﻨﺎك ﻣﺸﻜﻠﺔ ﺑﺮﻣﺠﻴﺔ
ﻫﻲ ﻃﺮﻳﻘﺘﻪ -وإذا ﺿﻐﻄﺖ اﻟﺪاﺋﺮة اﳊﻤﺮاء ،ﺳﻴﻈﻬﺮ ﻟﻚ ﺳﻄﺮ ﻣﻦ .bug
اﳌﻌﻠﻮﻣﺎت اﳌﻘﺘﻀﺒﺔ اﺳﻔﻞ ﺷﺮﻳﻂ اﻷدوات ﺷﺎرﺣ َﺎ ﺳﺒﺐ اﻻﻋﺘﺮاض: ﻛﻤﺜﺎل ﻗﻤﺖ ﺑﺎﺳﺘﺒﺪال داﻟﺔ NSLogﺑﺪاﻟﺔ اﺧﺮى وﻟﻜﻨﻨﻲ ”اﻏﻔﻠﺖ
error: parse error before “release”. ﻋﻤﺪاَ“ اﺿﺎﻓﺔ اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ اﻟﺘﻲ ﺗﻌﻠﻦ اﻧﺘﻬﺎء اﻟﺴﻄﺮ.
٣٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
وﻟﻨﺮى ][1 وﻟﻨﺪرﺟﻬﺎ ﺑﺸﻔﺮة ﻫﺬا اﻟﺒﺮﻧﺎﻣﺞ اﻟﺬي ﻗﺪﻣﺘﻪ ﻟﻨﺎ أﭘﻞ اﳌﺠﻤﻊ:
ان ﻋﻤﻠﻴﺔ اﻟﺘﻔﺴﻴﺮ ﻣﺮﺣﻠﺔ ﻣﻦ اﺣﺪ اﳌﺮاﺣﻞ اﻟﺘﻲ ﻳﻘﻮم ﺑﻬﺎ ّ
ﻧﺘﺎﺟﻪ ﺑﺎﳌﺜﺎل ][3 ﻓﻬﻮ ﻳﺴﺒﺮ ﻛﺎﻓﺔ ﺳﻄﻮر اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣ ّﻘﻴﻤ َﺎ ﻣﺎ اذا ﻛﺎﻧﺖ ﻣﻘﺒﻮﻟﺔ
][3 ﻟﺪﻳﻪ أو ﻣﺮﻓﻮﺿﺔ.
اﳌﺠﻤﻊ ﺑﺒﻌﺾ اﳊﻠﻮل ،ﻓﻨﺤﻦ ﻧﻘﺪم ﻟﻪ ﻳﺪ واﻻﻣﺮ ﻳﻌﻮد ﻟﻚ ﻟﺘﺰوﻳﺪ ّ
>#import <Foundation/Foundation.h
اﻟﻌﻮن ﻟﺘﻘﺒﻞ ﺑﻌﺾ اﳉﺰﺋﻴﺎت ،ﻓﺈﻳﻌﺎز ﺟﻠﺐ اﳌﺼﺎدر importﻣﺼﺮح
;)float circleArea(float theRadius // ﻋﻨﻪ ﺑﺎﺳﺘﺨﺪام رﻣﺰ اﳌﺮﺑﻊ ،#وﻟﻠﺘﻨﻮﻳﻪ ﻋﻦ اﻧﺘﻬﺎء ﺳﻄﺮ اﻟﺸﻔﺮة
][3.3
اﳌﺠﻤﻊ
اﻟﺒﺮﻣﺠﻲ إﺳﺘﺨﺪﻣﻨﺎ اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ ] ، [2.8وﺑﻴﻨﻤﺎ ﻳﺴﺒﺮ ّ
)][int main (int argc, const char * argv اﻻﻳﻌﺎز ] [2.9ﺳﻴﻠﺤﻆ اﻣﺮاَ ﻳﺸﻜﻞ ﺧﻄﺎء ﻳﺴﺘﺪﻋﻲ ﻣﻨﻪ اﻟﺘﻮﻗﻒ.
]// [3.5
{ اﳌﺠﻤﻊ ﻣﻜﻤﻦ ﺣﺪوث اﳋﻄﺎء ﺑﺬﻟﻚ ﻋﻠﻰ ﻛﻞ ﺣﺎل ﻟﻦ ﻳﺪرك ّ
= NSAutoreleasePool * pool اﻟﺴﻄﺮ ،ﺑﻞ ﺳﻴﻘﻮم ﺑﺎﻟﻘﺎء اﳋﻄﺎء ﻋﻠﻰ ذﻟﻚ اﻟﺴﻄﺮ اﻟﺬي ﻳﻔﺘﻘﺪ
;][[NSAutoreleasePool alloc] init
;int pictureWidth اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ.
float pictureHeight, pictureSurfaceArea,
;circleRadius, circleSurfaceArea اﳌﺠﻤﻊ ﻳﺤﺎول اﻋﻄﺎءك ﻣﻌﻠﻮﻣﺎت ﺣﻮل اﻻﺧﻄﺎء واﻟﻌﺒﺮة ﻫﻨﺎ ﻫﻲ ان ّ
;pictureWidth = 8 اﻟﺘﻲ ﻳﺼﺎدﻓﻬﺎ ،اﻻ اﻧﻪ ﻓﻲ ﻣﻮاﺿﻊ ﻛﺜﻴﺮة ﻳﻜﻮن ﻏﻴﺮ دﻗﻴﻖ ﻓﻲ وﺿﻊ
;pictureHeight = 4.5
;circleRadius = 5.0 اﻟﻴﺪ ﻋﻠﻴﻬﺎ )ﻫﻮ ﻟﻴﺲ دﻗﻴﻖ ﺑﺎﻟﻀﺮورة وﻟﻜﻨﻪ ﻗﺮﻳﺐ ﻣﻦ ﺗﻌﻴﻴﻨﻬﺎ(.
* pictureSurfaceArea = pictureWidth
;pictureHeight ﻗﻢ ﺑﺎﺻﻼح اﳋﻄﺎء اﻟﻮارد ﺑﺎﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﺿﺎﻓﺔ اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ اﻟﺘﻲ
اﻏﻠﻔﻨﺎﻫﺎ ﻋﻤﺪاً وأﻋﺪ ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ،وﻛﻦ ﻋﻠﻰ ﻳﻘﲔ ﻣﻦ اﻧﻪ
// Continued ...
ﻳﻌﻤﻞ ﺑﺎﻟﺸﻜﻞ اﳌﺘﻮﻗﻊ اﻟﺬي ﻗﻤﺖ ﺑﺘﺮﺗﻴﺒﺔ.
دﻋﻨﺎ اﻻن ﻧﺄﺧﺬ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ ﺗﻨﺎوﻟﻨﺎﻫﺎ ﺑﺎﻟﻔﺼﻞ اﻟﺴﺎﺑﻖ
٣٧
ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
)(main ﺑﺎﻟﺴﻄﺮ ] [3.29وﻫﻲ اﻟﺘﻲ ﺗﺴﺒﻖ ﻇﻬﻮر اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ circleSurfaceArea = circleArea(circleRadi
;)us
ﺑـﺎﻟﺴﻄﺮ ] ،[3.5ﻓﺘﻠﻚ ﻫﻲ ﻣﻮاﺿﻌﻬﺎ اﻟﺼﺤﻴﺤﺔ. NSLog(@”Area of picture: %f. Area of
circle: %10.2f.”,
ﻟﻘﺪ وﺿﻌﻨﺎ اﻟﺒﻨﻴﺔ اﻟﺒﺮﻣﺠﻴﺔ ﻟﻠﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ )( mainﺣﻴﺚ اﺧﺒﺮﺗﻨﺎ pictureSurfaceArea,
أﭘﻞ ،ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﺗﻠﻚ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ،ﺳﻴﻜﻮن اﳋﺮج ﻛﻤﺎ ﻳﻠﻲ: ;)circleSurfaceArea
;][pool release
Area of picture: 36.000000. Area of circle: ;return 0
78.54. }
)float circleArea(float theRadius
justatry has exited with status 0. ]// [3.22
{
ﻟﻘﺪ ﻗﺎم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺘﻨﻔﻴﺬ اﻟﺘﻌﻠﻴﻤﺎت اﳌﻄﻠﻮﺑﺔ ﻣﻨﻪ واﻧﺘﻬﻰ ﻣﻦ اﻟﻌﻤﻞ ;float theArea
;theArea = 3.1416 * theRadius * theRadius
ﻣﻨﻬﻴ َﺎ ﻧﻔﺴﻪ ﺑﺎن اﻋﻠﻦ ﻋﻦ ذﻟﻚ اﳊﺪث ﺑﻘﻴﻤﺔ ﺻﻔﺮ اﳌﻌﻠﻨﺔ .ﻓﻌﻨﺪﻣﺎ ;return theArea
ﻳﺒﺪأ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﻟﺘﻮﺳﻊ واﻟﺘﻌﻘﻴﺪ ،ﻋﻨﺪﻫﺎ ﺗﺼﺒﺢ ﻋﻤﻠﻴﺎت ﺗﻘﺼﻲ }
٣٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
٣٩
ﲡﻤﻴﻊ وﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٤٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺘﻌﻠﻴﻤﺎت اﻟﺸﺮﻃﻴﺔ
اﻟﺘﻌﻠﻴﻤﺎت اﻟﺸﺮﻃﻴﺔ
ﻓﻲ ﺑﻌﺾ اﻻﺣﻴﺎن ﻗﺪ ﺗﺮﻏﺐ ﺑﺠﻌﻞ ﺷﻔﺮﺗﻚ اﻟﺒﺮﻣﺠﻴﺔ ﻗﺎدرة ﻋﻠﻰ
ﺗﻮﺟﻴﺔ ﻋﻤﻠﻴﺔ ﺳﻴﺮ اواﻣﺮ اﻟﺒﺮﻧﺎﻣﺞ ﺑﻨﺎء ﻋﻠﻰ اﺳﺘﻴﻔﺎء ﺷﺮوط ﻣﻌﻴﻨﺔ.
ﻟﺬا ﺗﻮﺟﺪ ﻣﻔﺮدات ﻣﺤﺠﻮزة ﻟﺘﺤﻘﻴﻖ ﻫﺬا اﻻﻣﺮ.
][1
;int age = 42
)if (age > 30 // The > symbol means
”“greater than
{
;)”NSLog(@”age is older than thirty.
]//[1.4
}
]NSLog(@”Finished.”); //[1.6
٤١
اﻟﺘﻌﻠﻴﻤﺎت اﻟﺸﺮﻃﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻳﺴﺎوي == ﻧﺺ ﺳﻠﺴﻠﺔ اﳊﺮوف اﳌﻌﻴﻨﺔ ﺑـ ] ،[1.6ﺳﻮاء ﰎ اﺳﺘﻴﻔﺎء اﻟﺸﺮط ﻣﻦ
اﻛﺒﺮ ﻣﻦ > ﻋﺪﻣﺔ ذﻟﻚ ﻳﻌﻮد ﻻن ﻣﻮﻗﻌﻬﺎ ﺧﺎرج ﻧﻄﺎق اﻟﺸﺮط ،اي ﺧﺎرج
اﺻﻐﺮ ﻣﻦ <
اﻛﺒﺮ ﻣﻦ أو ﻳﺴﺎوي =>
اﻻﻗﻮاس اﳌﻌﻘﻮﻓﺔ.
اﺻﻐﺮ ﻣﻦ أو ﻳﺴﺎوي =< ﳝﻜﻨﻨﺎ اﻳﻀ َﺎ ﺗﺰوﻳﺪ اﺳﺘﻌﻼم اﻟﺸﺮط ﺑﺘﻌﻠﻴﻤﺎت اﺧﺮى ﻓﻲ ﺣﺎل ﻟﻢ
ﻻﻳﺴﺎوي =!
ﻳﺘﻢ اﻻﺳﺘﻴﻔﺎء .ﺑﺎﺳﺘﺨﺪام ﻣﻔﺮدة if...else statementﺑﺎﳌﺜﺎل ].[2
][2
ﲤﻌﻦ ﲟﻌﺎﻣﻞ رﻣﺰ ﻣﻔﺎﺿﻠﺔ اﳌﺴﺎواة ﻫﻨﺎ ﺣﻴﺚ ﻟﺪﻳﻨﺎ ﻋﻼﻣﺘﻲ ﻳﺴﺎوي ;int age = 42
ﻣﺘﻜﺮرة "==" وﻫﻲ ﻣﻦ اﻟﺴﻬﻮﻟﺔ ﺑﺤﻴﺚ ان ﻳﺘﻢ ادراج واﺣﺪة ﻓﻘﻂ )if (age > 30
{
ﻣﻊ ﻧﺴﻴﺎن اﻻﺧﺮى ﻋﻨﺪﻫﺎ ﺳﻴﺘﻢ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ذﻟﻚ اﻻﻳﻌﺎز ﻛﺎﺳﻨﺎد ;)”NSLog(@”age is older than thirty.
ﻟﻠﻘﻴﻤﺔ ﺑﺎﻟﺮﻏﻢ ﻣﻦ اﻧﻨﺎ ﻗﺪ ﻧﺮﻏﺐ ﺑﺎﺟﺮاء اﺧﺘﺒﺎر ﻣﻔﺎﺿﻠﺔ ﺗﺴﺎوي ﺑﲔ ]//[2.4
}
اﻟﻘﻴﻢ .وذﻟﻚ ﺧﻄﺎء ﺷﺒﻪ ﺷﺎﺋﻊ وﻣﺪﻋﺎة ﻟﻼرﺗﺒﺎك وأﺣﺪ اﻫﻢ اﺳﺒﺎب else
وﺟﻮد اﺧﻄﺎء ﺑﺮﻣﺠﻴﺔ ﺑﺎﻟﺸﻔﺮات اﳌﺼﺪرﻳﺔ ﻟﻠﻤﺒﺘﺪﺋﲔ. {
;)”NSLog(@”age is not older thirty.
ردد ﻣﻌﻲ ﺑﺼﻮت ﻋﺎﻟﻲ و ﻣﺴﻤﻮع: ]//[2.7
}
ﻟﻦ اﻧﺴﻰ اﺳﺘﺨﺪام ﻋﻼﻣﺘﻲ ﻳﺴﺎوي ﻣﺜﻞ ﻫﺬﻩ == ﻣﺘﻰ رﻏﺒﺖ ]NSLog(@”Finished.”); //[1.6
٤٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺘﻌﻠﻴﻤﺎت اﻟﺸﺮﻃﻴﺔ
][4
) )if ( (age >= 18) && (age < 65
دﻋﻨﺎ اﻻن ﻧﻨﺎﻗﺶ ﺑﻌﺾ اﳌﻔﺎﻫﻴﻢ اﻟﺘﻲ ﻗﺪ ﻳﻜﻮن ﻟﻬﺎ اﺳﺘﺨﺪام ﻣﺜﻴﺮ.
{ و ﻟﻨﺘﻔﺤﺺ ﺑﺸﻜﻞ اﻋﻤﻖ ﻋﻤﻠﻴﺔ اﳌﻔﺎﺿﻠﺔ ﻫﺬﻩ .ان ﻧﺘﻴﺠﺔ اﳌﻔﺎﺿﻠﺔ
NSLog(@”Probably has to work for a
;)”living.
ﺗﻨﺤﺼﺮ ﺑﲔ ﻧﺘﻴﺠﺘﲔ ﻻ ﺛﺎﻟﺚ ﻟﻬﻤﺎ :اﻟﻨﺘﻴﺠﺔ إﻣﺎ ﺗﻜﻮن ﺻﺤﻴﺤﺔ أو
} ﻏﻴﺮ-ﺻﺤﻴﺤﺔ/ﺧﺎﻃﺌﺔ .true or false
ﻣﻦ اﳌﻤﻜﻦ ﺗﻌﺸﻴﺶ ﻋﺪة اﻳﻌﺎزات اﺷﺘﺮاﻃﻴﺔ .-nested condition- ﻓﻲ ، Objective-Cﻳﺘﻢ ﲤﺜﻴﻞ اﻟﻨﺘﻴﺠﺔ اﻟﺼﺤﻴﺤﺔ أو ﻏﻴﺮ-اﻟﺼﺤﻴﺤﺔ
ﻓﻬﻲ ﺑﺒﺴﺎﻃﺔ ﺗﺘﻤﺜﻞ ﺑﺎدراج ﺷﺮط داﺧﻞ اﻻﻗﻮاس اﳌﻌﻘﻮﻓﺔ ﻟﻼﺷﺘﺮاط ﺑﺈﻣﺎ 1أو 0ﻋﻠﻰ اﻟﺘﻮاﻟﻲ .ﺣﺘﻰ اﻧﻪ ﻳﻮﺟﺪ ﻧﻮع ﺧﺎص ﻣﻦ اﻟﺘﺼﻨﻴﻔﺎت
اﻻول .ﻋﻨﺪﻫﺎ ﺳﻴﺘﻢ ﺗﻘﻴﻴﻢ اﻻﺷﺘﺮاط اﻻول ،ﺛﻢ ﺑﻌﺪ اﺳﺘﻴﻔﺎء ﲢﻘﻴﻖ اﺳﻤﺔ BOOLﺗﻨﺤﺼﺮ ﻣﻬﻤﺘﺔ ﺑﺎﻇﻬﺎر ﻫﺬﻩ اﻟﻨﺘﻴﺠﺔ .وﺣﺘﻰ ﻧﻘﻮل
ﺣﻘﻴﻘﺔ ﺷﺮوﻃﺔ ﺳﻴﺘﻢ ﺗﻘﻴﻴﻢ اﻻﻳﻌﺎز اﻟﺸﺮﻃﻲ اﳌﻌﺸﺶ داﺧﻠﻪ وﻫﻜﺬا ان ﻗﻴﻤﺔ اﻟﻨﺘﻴﺠﺔ ”ﺻﺤﻴﺤﺔ “trueﳝﻜﻨﻚ اﻣﺎ ﻛﺘﺎﺑﺔ 1أو .YES
ﺗﺒﺎﻋ َﺎ. وﻻﺳﻨﺎد ﻗﻴﻤﺔ ﻏﻴﺮ-ﺻﺤﻴﺤﺔ/ﺧﺎﻃﺌﺔ ﳝﻜﻨﻚ اﻣﺎ ﻛﺘﺎﺑﺔ 0أو NO
][5 ][3
)if (age >= 18 ;int x = 3
{ ;BOOL y
)if (age < 65 ;)y = (x == 4 // y will be 0.
{
NSLog(@”Probably has to work for a
;)”living. ﻣﻦ اﳌﻤﻜﻦ ﻋﻤﻞ اﺧﺘﺒﺎر ﺣﻘﻴﻘﺔ ﻷﻛﺜﺮ ﻣﻦ ﺷﺮط .وﻳﺘﻢ ذﻟﻚ ﻋﻨﺪﻣﺎ
}
}
ﻳﺘﻄﻠﺐ اﻻﻣﺮ اﺳﺘﻴﻔﺎء ﻛﺎﻓﺔ اﻟﺸﺮوط ،ﻋﻨﺪﻫﺎ ﻧﺴﺘﺨﺪم اﳌﻌﺎﻣﻞ
اﳌﻨﻄﻘﻲ ، ANDوﻫﻮ ﻳﺮد داﺋﻤﺎ ﺑﻌﻼﻣﺘﻲ ampersands: &&.
ﺗﺘﻘﺪﻣﻪ .اﻣﺎ ﻋﻨﺪ اﺷﺘﺮاط ﻗﻴﻤﺔ ﺻﺤﻴﺤﺔ ﻣﺘﺤﻘﻘﻪ ﻷﺣﺪ اﻟﺸﺮوط،
ﻋﻨﺪﻫﺎ ﻧﺴﺘﺨﺪم اﳌﻌﺎﻣﻞ اﳌﻨﻄﻘﻲ ، ORوﻫﻮ ﻳﺮد داﺋﻤﺎ ﺑﻌﻼﻣﺘﻲ|| .
٤٣
اﻟﺘﻌﻠﻴﻤﺎت اﻟﺸﺮﻃﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٤٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻜﺮرة
اﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻜﺮرة
ﻛﺎﻓﺔ اﻻﻳﻌﺎزات واﻻواﻣﺮ اﻟﺘﻲ ﻣﺮرﻧﺎ ﺑﻬﺎ ﻓﻲ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ ﺳﺎﺑﻘ َﺎ
ﺗﻨﻔﺬ ﻣﺮة واﺣﺪة ﻓﻘﻂ .ﳝﻜﻨﻨﺎ دوﻣ َﺎ ﺗﻜﺮار ﺗﻨﻔﻴﺬ اواﻣﺮ اﻟﺪاﻻت
ﺑﺎﺳﺘﺪﻋﺎﺋﻬﺎ ﻣﺮاراَ وﺗﻜﺮارا َ].[1
][1
;)”NSLog(@”Julia is a pretty actress.
;)”NSLog(@”Julia is a pretty actress.
;)”NSLog(@”Julia is a pretty actress.
ﺑﻨﺎء ﻋﻠﻰ ذﻟﻚ ﺳﻴﺘﻢ اﺳﺘﺪﻋﺎء وﺗﻨﻔﻴﺬ اﻟﺪاﻟﺔ ﺣﺴﺐ ﻋﺪد اﳌﺮات اﻟﺘﻲ
وردت وﻟﻜﻦ ﺗﻜﺮار ﻛﺘﺎﺑﺔ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ داﺧﻞ اﻟﺸﻔﺮة ﻳﻌﺪ اﻣﺮاَ
ﻏﻴﺮ ﻋﻤﻠﻲ .ﻗﻔﻲ ﺑﻌﺾ اﻻﺣﻴﺎن ﻳﺘﻄﻠﺐ ان ﻳﺘﻢ ﺗﻜﺮار ﺗﻨﻔﻴﺬ اﻻﻳﻌﺎز
أو اﻟﺪاﻟﺔ ﻋﺪد ﻣﻌﲔ ﻣﻦ اﳌﺮات ﻳﺤﺪد وﻗﺖ ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ.
ﻣﺜﻠﻬﺎ ﻣﺜﻞ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻻﺧﺮى ،ﺗﻘﺪم ﻟﻚ ﻟﻐﺔ Objective-Cﻋﺪة
ﻃﺮق ﻟﺘﺤﻘﻴﻖ ذﻟﻚ ﻓﺎذا ﺣﺪدت اﻟﻌﺪد اﳌﻄﻠﻮب ﻣﻦ اﳌﺮات اﻟﻼزﻣﺔ
ﻻﺟﺮاء اﻟﺘﻜﺮار ﻋﻠﻰ اﻻﻳﻌﺎز أو ﻣﺠﻤﻮﻋﺔ اﻻﻳﻌﺎزات أو اﻟﺪاﻻت،
ﻋﻨﺪﻫﺎ ﳝﻜﻨﻚ ﲢﺪﻳﺪ ذﻟﻚ اﻟﺮﻗﻢ ﻣﺴﺘﺨﺪﻣ َﺎ ﻣﻔﺮدة forاﳋﺎﺻﺔ
ﺑﺈﺟﺮاء ﺣﻠﻘﺔ ﺗﻜﺮارﻳﺔ ،وﻟﻠﻌﻠﻢ ﻳﺠﺐ ان ﻳﻜﻮن اﻟﻌﺪد ﺻﺤﻴﺢ
integer،ﺣﻴﺚ ﻟﻦ ﺗﺴﺘﻄﻴﻊ ﻋﻤﻞ ﺧﻤﺲ دورات وﻧﺺ!
٤٥
اﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻜﺮرة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٤٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻜﺮرة
][4
;int counter = 1
وﺧﺮج اﻟﺒﺮﻧﺎﻣﺞ ﺳﻴﻜﻮن:
)while (counter <= 10 0.00 >- -17.78
{ 20.00 >- -6.67
;)”NSLog(@”Julia is a pretty actress.\n 40.00 >- 4.44
;counter = counter + 1 60.00 >- 15.56
} 80.00 >- 26.67
NSLog(@”The value of counter is %d”, 100.00 >- 37.78
;)counter 120.00 >- 48.89
140.00 >- 60.00
ﻓﻲ ﻫﺬﻩ اﳊﺎﻟﺔ ،ﺳﺘﻜﻮن ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ counterﺗﺴﺎوي ،١١ﻓﻬﻞ 160.00 >- 71.11
ﻣﻦ اﻫﻤﻴﺔ ﻟﻬﺎ ﺑﻌﺪ ذﻟﻚ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ؟ -اﻻﻣﺮ ﻋﺎﺋﺪ اﻟﻴﻚ.. 180.00
200.00
>-
>-
82.22
93.33
ان اﺳﺘﺨﺪام اﻳﻌﺎز ﺣﻠﻘﺔ )( do {} whileﻳﻌﻄﻲ اﻟﻔﺮﺻﺔ ﻟﺘﻨﻔﻴﺬ ﻃﺮق اﺧﺮى ﻟﻌﻤﻞ Objective-Cﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ for..loopﺗﻘﺪم ﻟﻚ
ﻟﻠﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﺎ ﺑﲔ اﻻﻗﻮاس اﳌﻌﻘﻮﻓﺔ ﻣﺮة واﺣﺪة ﻋﻠﻰ اﻻﻗﻞ. ﺣﻠﻘﺎت اﻟﺘﻜﺮار ﻣﻦ ﺧﻼل اﳌﻔﺮدات:
][5 } { )( while
;int counter = 1
do وأﻳﻀ َﺎ
{
;)”NSLog(@”Julia is a pretty actress.\n )( do {} while
٤٧
اﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻜﺮرة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٤٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
٤٩
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻟﺘﻨﻔﻴﺬ ذﻟﻚ اﳉﺰء اﳌﺘﻌﻠﻖ ﺑﺈﻏﻼق اﻟﻨﺎﻓﺬة ﻟﺬاﺗﻬﺎ.ﺑﺈﺧﺘﺼﺎر ﻟﻘﺪ اﻻﻟﺔ اﳊﺎﺳﺒﺔ( .ﻟﻜﻦ ﻣﺎﻟﻌﻤﻞ ﻋﻨﺪﻣﺎ ﻳﺘﻌﺎﻣﻞ ﺑﺮﻧﺎﻣﺠﻚ ﻋﻠﻰ ﺳﺒﻴﻞ
ﺗﻠﻘﺖ اﻟﻨﺎﻓﺬة رﺳﺎﻟﺔ ﺗﻔﻴﺪﻫﺎ ﺑﺎﻏﻼق ذاﺗﻬﺎ. اﳌﺜﺎل ﻣﻊ ﻣﻘﻄﻮﻋﺎت ﻣﻮﺳﻴﻘﻴﺔ و ﻣﻜﻮﻧﺎت أﺧﺮى ﻛﻼﺋﺤﺔ ﺑﺎﺳﻤﺎء
اﳌﻘﻄﻮﻋﺎت ،وﻻﺋﺤﺔ ﺑﺎﺳﻤﺎء اﳌﻐﻨﲔ؟ أو ان ﻳﺪﻳﺮ ﺑﺮﻧﺎﻣﺠﻚ ﻋﻠﻰ
ﺳﺒﻴﻞ اﳌﺜﺎل اﳊﺮﻛﺔ اﳉﻮﻳﺔ ﻛﻨﻈﺎم ﻻدارة اﻟﻄﺎﺋﺮات واﻟﺮﺣﻼت
واﳌﻄﺎرات؟ اﻟﻦ ﻳﻜﻮن ﻣﻦ اﻟﺮاﺋﻊ ان ﺗﺘﻌﺎﻣﻞ ﻣﻊ ﺗﻠﻚ اﳌﻌﻄﻴﺎت ﻣﻦ
ﺧﻼل Objective-Cﻛﻤﺎ ﻟﻮ اﻧﻚ ﺗﺘﻌﺎﻣﻞ ﻣﻊ اﻻﻋﺪاد؟
ﻫﻨﺎ ﻳﺄﺗﻲ دور اﻟﻜﺎﺋﻨﺎت .ﻓﻤﻦ ﺧﻼل Objective-Cﳝﻜﻨﻚ وﺿﻊ
ﺗﻮﺻﻴﻒ ﻟﻨﻮع اﻟﻜﺎﺋﻦ اﻟﺒﺮﻣﺠﻲ اﻟﺬي ﺗﺮﻏﺐ ﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻌﻪ ،وﻣﻦ ﺛﻢ
ﺗﻜﺘﺐ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﳌﻼﺋﻤﺔ ﻟﻠﺘﻌﺎﻣﻞ واﻟﺘﻌﺎﻃﻲ ﻣﻌﻪ.
ﻛﻤﺜﺎل ﻋﻠﻰ ذﻟﻚ دﻋﻨﺎ ﻧﻠﻘﻲ ﻧﻈﺮة ﻋﻠﻰ ﻧﺎﻓﺬة اي ﺑﺮﻧﺎﻣﺞ ﻣﻦ إﻧﺸﺎء
ﻼ .ﺗﻔﺤﺺ ﻧﺎﻓﺬة اﻟﺒﺮﻧﺎﻣﺞ ، Objective-Cﻛﺒﺮﻧﺎﻣﺞ Safariﻣﺜ َ
واﻧﻈﺮ ﻟﺘﻠﻚ اﳌﺴﺎﺣﺔ اﻟﻌﻠﻮﻳﺔ ﻣﻦ اﻟﻨﺎﻓﺬة ﺣﻴﺚ ﲡﺪ ﺗﻠﻚ اﻻزرار
اﻟﺜﻼﺛﺔ .ﺳﺘﺠﺪ ان اﻟﺰر اﻻﺣﻤﺮ ﻣﻨﻬﺎ ُﻳﻐﻠﻖ اﻟﻨﺎﻓﺬة ﲟﺠﺮد ﺿﻐﻄﻚ
ﻋﻠﻴﻪ ﺑﺎﻟﻔﺄرة .ﺗﺮى ﻣﺎﻟﺬي ﻳﺤﺪث ﻋﻨﺪﻣﺎ ﺗﻐﻠﻖ اﻟﻨﺎﻓﺬة ﺟﺮاء ﺿﻐﻄﻚ
اﻟﻨﺎﻓﺬة ﺗﺘﻠﻘﻰ رﺳﺎﻟﺔ إﻏﻼق ﻟﺬﻟﻚ اﻟﺰر اﻻﺣﻤﺮ؟
ﻓﺎﻟﻨﺎﻓﺬة ذاﺗﻬﺎ ﺗﻌﺪ ﻛﺎﺋﻦ ﺑﺮﻣﺠﻲ .ﺣﻴﺚ ﳝﻜﻨﻚ ﺳﺤﺒﻬﺎ ﻫﻨﺎ ﻟﻘﺪ اﻏﻠﻘﺖ اﻟﻨﺎﻓﺬة ذاﺗﻬﺎ ﻻﻧﻬﺎ ﺗﻠﻘﺖ رﺳﺎﻟﺔ messageﻣﻦ ذﻟﻚ
وﻫﻨﺎك .ان ﺗﻠﻚ اﻻزرار اﻟﺜﻼﺛﺔ ﻓﻲ اﻻﺻﻞ ﻫﻲ ﻛﺎﺋﻨﺎت ﺑﺮﻣﺠﻴﺔ اﻟﺰر اﻻﺣﻤﺮ ﺗﻔﻴﺪﻫﺎ ﺑﻮﺟﻮب اﻏﻼق ذاﺗﻬﺎ .اﻧﻬﺎ ﻋﻤﻠﻴﺔ رد ﻓﻌﻞ
ﳝﻜﻨﻚ اﻟﻀﻐﻂ ﻋﻠﻰ اي ﻣﻨﻬﺎ .ﺗﻠﻚ اﻟﻜﺎﺋﻨﺎت اﻟﺒﺮﻣﺠﻴﺔ ﻣﺒﻨﻴﺔ وﺗﻨﻔﻴﺬ ﻟﺸﻔﺮة ﺑﺮﻣﺠﻴﺔ داﺧﻞ اﻟﻨﺎﻓﺬة ﻛﺎﻧﺖ اﻟﺮﺳﺎﻟﺔ ﻫﻲ اﳌﺴﺒﺐ
٥٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻟﻘﺪ وﺿﻌﻮا ﺑﻌﺾ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ ﻟﺘﻤﺜﻞ ﳕﻮذج ﻟﻠﻨﺎﻓﺬة ﺣﻴﺚ ﻣﻊ ﺧﺎﺻﻴﺔ ﲤﻜﻨﻬﺎ ﻣﻦ ﻣﻌﺮﻓﺘﻬﺎ ﻟﻜﻴﻔﻴﺔ اﻇﻬﺎر )رﺳﻢ( ذاﺗﻬﺎ ﻋﻠﻰ
ﺣﺪدوا اﻟﺘﺼﺮﻓﺎت واﻟﺴﻮﻟﻜﻴﺎت اﻟﻌﺎﻣﺔ اﻟﻮاﺟﺐ اﺗﺒﺎﻋﻬﺎ ﻟﺘﻠﻚ ﺷﺎﺷﺔ اﳌﺴﺘﺨﺪم.
اﻟﻨﺎﻓﺬة واﻃﻠﻘﻮا ﻋﻠﻴﻬﺎ ﺗﺼﻨﻴﻒ أو .Class ﻋﻠﻰ ﻛﻞ ﺟﺰء اﻹﻇﻬﺎر ﻫﺬا ﻟﻴﺲ ﺳﻤﺔ ﻏﺎﻟﺒﺔ ﻟﻜﻞ اﻟﻜﺎﺋﻨﺎت .ﻓﻌﻠﻰ
ﻓﻌﻨﺪﻣﺎﺗﻨﺸﻲءﻧﺎﻓﺬةﺟﺪﻳﺪةﻓﺎﻧﻚ ﺗﻌﺘﻤﺪﻓﻲإﻧﺸﺎﺋﻚﻟﻬﺎﻋﻠﻰﻧﺴﺨﺔ ﺳﺒﻴﻞ اﳌﺜﺎل ﻫﻨﺎك ﻛﺎﺋﻨﺎت ﲤﺜﻞ ﻋﻤﻠﻴﺔ اﻻﺗﺼﺎﻻت ﻣﺎﺑﲔ ﺑﺮﻧﺎﻣﺞ
ﻣﻦ ذﻟﻚ اﻟﺘﺼﻨﻴﻒ Classاﻟﺬي ﻳﺤﺘﻮي ﺗﻮﺻﻴﻒ ﻟﻠﻨﻤﻮذج اﻻﺻﻞ ﺳﻔﺎري وذﻟﻚ اﳌﻮﻗﻊ اﻻﻟﻜﺘﺮوﻧﻲ وﻟﻜﻨﻬﺎ ﻻﲤﺜﻞ ذاﺗﻬﺎ ﺑﺼﺮﻳ َﺎ ﻋﻠﻰ
ﻟﻠﻨﺎﻓﺬة .ﻓﺎﻟﺘﺼﻨﻴﻒ Classﻫﻨﺎ ﳝﺜﻞ ﻣﻔﻬﻮم ﻋﻦ اﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج .ﳑﺎ اﻟﺸﺎﺷﺔ.
ﻳﻌﻨﻲ ان اي ﻧﺎﻓﺬة ﺗﺮاﻫﺎ اﻣﺎﻣﻚ اﳕﺎ ﻫﻲ ﻓﻲ اﻟﻮاﻗﻊ ﻣﺴﺘﻨﺴﺦ instance
ﻛﺎﺋﻦ ﻧﺎﻓﺬة ﻳﺤﺘﻮى ﻛﺎﺋﻨﺎت اﻻزرار
ﻣﻦ ﻣﻔﻬﻮم اﻟﻨﺎﻓﺬة اﻟﻨﻤﻮذج) .ﻓﻲ ذات اﻟﺴﻴﺎق ﻧﺴﺘﻮﻋﺐ ان اﻟﻌﺪد
٧٦اﳕﺎ ﻫﻮ ﻣﺴﺘﻨﺴﺦ ﻣﻦ ﻣﻔﻬﻮم ﺗﺼﻨﻴﻒ اﻻﻋﺪاد(. ﻼ( ﳝﻜﻨﻪ ان ﻳﺤﺘﻮي ﻋﻠﻰ اي ﻛﺎﺋﻨﺎت ان اي ﻛﺎﺋﻦ )اﻟﻨﺎﻓﺬة ﻣﺜ َ
ان اﻟﻨﺎﻓﺬة اﻟﺘﻲ ﻗﻤﺖ ﺑﺎﻧﺸﺎءﻫﺎ ﺗﺘﺨﺬ ﻣﻮﻗﻊ وﻣﺴﺎﺣﺔ ﻣﻌﻴﻨﺔ ﻣﻦ اﺧﺮى )اﻻزرار اﻟﺜﻼﺛﺔ( .ﳝﻜﻦ ﻟﺒﺮﻧﺎﻣﺞ ﺳﻔﺎري ان ﻳﺰودك ﺑﺎي ﻋﺪد
ﺷﺎﺷﺔ اﳌﺎﻛﻨﺘﻮش .ﻓﺈذا ﻗﻤﺖ ﺑﺘﺼﻐﻴﺮﻫﺎ إﻟﻰ اﳌﻨﺼﺔ ،Dockﺛﻢ ﻣﻦ اﻟﻨﻮاﻓﺬ اﻟﺘﻲ ﺗﺮﻳﺪﻫﺎ.
ﻗﻤﺖ ﺑﺈﺳﺘﺪﻋﺎﺋﻬﺎ ﻣﺮة اﺧﺮى ﺳﺘﺮى اﻧﻬﺎ ﺗﻌﻮد اﻟﻰ ذات اﳌﻜﺎن اﻟﺬي ﺗﺮى ﻫﻞ ﻛﻨﺖ ﺗﺘﻮﻗﻊ ان:
ﻛﺎﻧﺖ ﻣﺘﻤﻮﺿﻌﺔ ﻓﻴﻪ .ﻳﺎ ﺗﺮى ﻛﻴﻒ ﺗﻌﻤﻞ ﻫﺬﻩ اﻻﻣﻮر؟ .١ﻗﺒﺎم ﻣﺒﺮﻣﺠﻲ أﭘﻞ ﺑﺒﺮﻣﺠﺔ ﻛﻞ ﺗﻠﻚ اﻟﻨﻮاﻓﺬ ﻣﺴﺒﻘ َﺎ ﻣﺴﺘﻨﻔﺬﻳﻦ
ﺳﻨﺮى ان اﻟﺘﺼﻨﻴﻒ اﻻﺳﺎﺳﻲ ﻳ ّﻌﺮف ﻋﺪد ﻣﻦ اﳌﺘﻐﻴﺮات اﳌﻨﺎﺳﺒﺔ ﻛﺎﻓﺔ ﻣﻮاردﻫﻢ اﻟﻌﻘﻠﻴﺔ واﳊﺴﺎﺑﻴﺔ ﺣﺘﻰ ﻳﻠﺒﻮا ﻃﻠﺒﺎﺗﻚ ﻣﻦ اﻟﻨﻮاﻓﺬ
واﻟﺘﻲ ﺗ ّﺘﺤﺪّ د ﻣﻬﻤﺘﻬﺎ ﺑﺤﻔﻆ ﻣﻮﻗﻊ اﻟﻨﺎﻓﺬة ﻣﻦ اﻟﺸﺎﺷﺔ. اﻟﺘﻲ ﻗﺪ ﲢﺘﺎﺟﻬﺎ؟
ان ﻣﺴﺘﻨﺴﺦ اﻟﺘﺼﻨﻴﻒ ،class instanceأو اﻟﻜﺎﺋﻦ اﳊﺎﻟﻲ ﻳﺤﺘﻔﻆ .٢ﻗﺎﻣﻮا ﺑﻮﺿﻊ ﳕﻮذج ﻟﻠﻨﺎﻓﺬة وﻣﻜﻨﻮا ﺑﺮﻧﺎﻣﺞ ﺳﻔﺎري ﻣﻦ اﺳﺘﺨﺪام
ﺑﺘﻠﻚ اﻟﻘﻴﻢ اﻟﺘﻲ ﺗﺨﺼﻪ ﻓﻲ ﻣﺘﻐﻴﺮاﺗﻪ اﻟﺘﻲ ﺗﺨﻀﻊ ﲢﺖ ﺗﺼﺮﻓﻪ. ذﻟﻚ اﻟﻨﻤﻮذج ﻻﻧﺸﺎء ﻧﻮاﻓﺬ اﺧﺮى وﻗﺖ اﻟﻄﻠﺐ؟
ﻟﺬا ﻛﻞ ﻛﺎﺋﻦ ﻧﺎﻓﺬة ﻳﺤﺘﻮي ﻣﺘﻐﻴﺮات ﻣﺤﺪدة وﺑﻘﻴﻢ ﺧﺎﺻﺔ ﺑﺬﻟﻚ ﻗﻄﻌ َﺎ اﻻﺟﺎﺑﺔ اﻟﺜﺎﻧﻴﺔ ﻫﻲ اﻟﺼﺤﻴﺤﺔ .
٥١
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﳊﻞ اﻻﻣﺜﻞ ﻫﻮ ان ﺗﻮﺟﺪ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﶈﺪدة ﻟﺴﻠﻮﻛﻴﺎت اﻟﻜﺎﺋﻦ .ان ﻋﺪة ﻛﺎﺋﻨﺎت ﻣﻦ اﻟﻨﻮاﻓﺬ اﳌﺨﺘﻠﻔﺔ ﻳﺤﺘﻔﻆ ﻛﻞ ﻛﺎﺋﻦ
وﺗﺼﺮﻓﺎت اﻟﻨﺎﻓﺬة ﲟﻮﻗﻊ ﻣﺮﻛﺰي واﺣﺪ ﻓﻘﻂ ،ﺣﻴﺚ ﻳﺘﻢ ﻣﺸﺎرﻛﺔ ﻣﻨﻬﺎ ﺑﻘﻴﻢ ﻣﺨﺘﻠﻔﺔ ﳌﺘﻐﻴﺮاﺗﻬﺎ اﳋﺎﺻﺔ ﺑﻬﺎ.
وﻣﺮاﺟﻌﺔ ﺗﻠﻚ اﻻواﻣﺮ واﻟﺴﻠﻮﻛﻴﺎت ﻣﻊ اي ﻛﺎﺋﻦ ﻧﺎﻓﺬة آﺧﺮ ﻳﻨﺘﻤﻲ ﻫﺬا اﻟﺘﺼﻨﻴﻒ ﻟﻢ ﻳﻘﻢ ﺑﺎﻧﺸﺎء ﻛﺎﺋﻦ اﻟﻨﺎﻓﺬة ﻓﻘﻂ ،ﻟﻜﻨﻪ ﻣﻜﻨﻬﺎ ﻣﻦ
ﻟﺬﻟﻚ اﻟﺘﺼﻨﻴﻒ. ﺳﻠﺴﻠﺔ ﻣﻦ اﻻﻧﺸﻄﺔ واﻟﺘﺼﺮﻓﺎت )إﺟﺮاءات (actionsاﻟﺘﻲ ﳝﻜﻦ
ﻛﻤﺎ أوردﻧﺎ ﺳﺎﺑﻘ َﺎ ﻣﻦ اﻣﺜﻠﺔ ،ﺳﺘﺤﺘﻮي اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ ﺳﺘﺮاﻫﺎ ﻟﻠﻨﺎﻓﺬة ان ﺗﺆدﻳﻬﺎ.
ﻓﻲ ﻫﺬا اﻟﻔﺼﻞ ﺑﻌﺾ اﻟﺴﻄﻮر اﻟﺘﻲ ﺗﻬﺘﻢ ﺑﺤﺠﺰ ﻣﻮاﻗﻊ اﻟﺬاﻛﺮة اﺣﺪ ﺗﻠﻚ اﻹﺟﺮاءات ،إﺟﺮاء اﻏﻼق اﻟﻨﺎﻓﺬة ﻟﺬاﺗﻬﺎ .closeﻓﻤﺘﻰ
وﺗﺴﺮﻳﺢ اﳊﺠﺰ ﺣﺘﻰ ﻳﺘﻤﻜﻦ اﻟﻨﻈﺎم ﻣﻦ اﺳﺘﻌﺎدﺗﻬﺎ وﺗﻮﻇﻴﻔﻬﺎ ﻣﺮة ﻣﺎ ﻗﻤﺖ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ ازرار اﻻﻏﻼق اﻻﺣﻤﺮ ﺑﺎﺣﺪ اﻟﻨﻮاﻓﺬ،
اﺧﺮى .وﻛﻤﺎ ﰎ اﻟﺘﻨﻮﻳﻪ ﺳﺎﺑﻘ َﺎ ﺳﻨﺘﻄﺮق ﻟﺸﺮح ﻫﺬﻩ اﻻﺳﻄﺮ ﻓﻲ ﺳﻴﻘﻮم اﻻزرار ﺑﺎرﺳﺎل رﺳﺎﻟﺔ اﻟﻰ اﻟﻨﺎﻓﺬة ﻣﻔﺎدﻫﺎ اﻏﻠﻘﻲ ذاﺗﻚ.
ﻣﻮاﺿﻴﻊ ﻣﺘﻘﺪﻣﺔ ﻻﺣﻘ َﺎ .ﻟﺬا ﻧﺮﺟﻮ اﳌﻌﺬرة... ان اﻹﺟﺮاءات اﻟﺘﻲ ﻳﻘﻮم ﺑﻬﺎ اﻟﻜﺎﺋﻦ ﺗﺴﻤﻰ .methodsﻛﻤﺎ ﺗﺮى
ﻓﻲ ﻫﺬا ﺳﻨﻘﻮم ﺑﺈﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﻣﻜﻮن ﻣﻦ ازرارﻳﻦ اﺛﻨﲔ وﺣﻘﻞ ﻧﺺ اﻧﻬﺎ ﺷﺪﻳﺪة اﻟﺸﺒﺔ ﺑﺎﻟﺪاﻻت ،وذﻟﻚ ﻟﻦ ﻳﺸﻜﻞ ﻣﺸﻜﻠﺔ ﻓﻲ اﻟﺘﻌﻠﻢ
.text fieldﺑﺤﻴﺚ اذا ﻗﻤﺖ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﺣﺪ اﻻزرار ،ﺳﻴﺘﻢ واﻻﺳﺘﺨﺪام اذا ﻛﻨﺖ ﻣﺘﺎﺑﻊ ﻣﻌﻨﺎ ﺣﺘﻰ اﻟﻠﺤﻈﺔ.
ﻋﺮض ﻗﻴﻤﺔ ﻣﺎ ﺑـ ﺣﻘﻞ اﻟﻨﺺ .وﻋﻨﺪ اﻟﻀﻐﻂ ﻋﻠﻰ اﻻزرار اﻻﺧﺮ ﺳﻴﺘﻢ ﻋﻨﺪﻣﺎ ﻳﻘﻮم اﻟﻨﻤﻮذج اﻟﺘﺼﻨﻴﻔﻲ ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﻧﺎﻓﺬة ﻣﻦ اﺟﻠﻚ،
ﻋﺮض ﻗﻴﻤﺔ اﺧﺮى ﺑﺤﻘﻞ اﻟﻨﺺ .ﻓﻜﺮ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ وﻛﺄﻧﻪ آﻟﻪ ﺣﺎﺳﺒﺔ ﻓﺈﻧﻪ ﻓﻲ اﻟﻮاﻗﻊ ﻳﺤﺠﺰ ﺟﺰء ﻣﻦ اﻟﺬاﻛﺮة ) (RAMﻛﻲ ﻳﺘﻢ ﺣﻔﻆ ﻣﻮﻗﻊ
ﻣﻜﻮﻧﺔ ﻣﻦ ازرارﻳﻦ وﻻﳝﻜﻨﻬﺎ ﻋﻤﻞ اي ﻋﻤﻠﻴﺎت ﺣﺴﺎﺑﻴﺔ... اﻟﻨﺎﻓﺬة ﻣﻦ اﻟﺸﺎﺷﺔ ،ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ﻋﺪد ﻣﻦ اﳌﻌﻠﻮﻣﺎت اﻻﺧﺮى.
ﻋﻠﻰ ﻛﻞ ﺣﺎل ﻋﻤﻠﻴﺔ اﻻﺳﺘﻨﺴﺎخ ﻫﺬﻩ ﻻ ﺗﻘﻮم ﺑﻨﺴﺦ ﻛﺎﻓﺔ اﻟﺸﻔﺮات
ﲟﺠﺮد ﺗﻌﻠﻢ اﳌﺰﻳﺪ ﳝﻜﻨﻚ ﺻﻨﻊ آﻟﺘﻚ اﳊﺎﺳﺒﺔ ﺑﺎﻟﺘﺄﻛﻴﺪ ،وﻟﻜﻨﻨﺎ اﻟﺒﺮﻣﺠﻴﺔ اﳌﻜﻮﻧﺔ ﻟﻠﻨﺎﻓﺬة ﻛﺎﻣﺮ اﻻﻏﻼق ﻣﺜﻼ .ﻫﺬا اﻟﻌﻤﻞ ﺳﻴﺒﺪد
ﻧﻔﻀﻞ اﻟﺘﻌﻠﻢ ﺧﻄﻮة ﺧﻄﻮة. ﺣﻴﺰ ﻛﺒﻴﺮ ﻣﻦ اﻟﺬاﻛﺮة اﳌﺘﺎﺣﺔ ﺣﻴﺚ ﺳﻴﺘﻢ ﻧﺴﺦ ﻛﺎﻓﺔ اﻟﺸﻔﺮات
اﻟﺒﺮﻣﺠﻴﺔ واﻹﺟﺮاءات اﳋﺎﺻﺔ ﺑﻜﻞ ﻧﺎﻓﺬة ﺗﻮﺟﺪ ﻫﻨﺎ أو ﻫﻨﺎك.
٥٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻟﺬا ﻓﻲ اﻟﺒﺪء ﻋﻠﻴﻨﺎ ﺑﺈﻧﺸﺎء اﻟﺘﺼﻨﻴﻒ اﳋﺎص ﺑﻨﺎ ﻛﻨﻤﻮذج ،ﺛﻢ ﻧﻘﻮم
ﺑﺈﺳﺘﻨﺴﺎﺧﻪ ﻛﻜﺎﺋﻦ .ﻫﻨﺎ ﺳﻴﻜﻮن ﻫﺬا اﻟﻜﺎﺋﻦ ﻫﻮ اﳌﺴﺘﻘﺒﻞ ﻟﻠﺮﺳﺎﺋﻞ
اﻟﺘﻲ ﺳﺘﺮﺳﻠﻬﺎ اﻟﻴﻪ ﺗﻠﻚ اﻻزرار )اﻧﻈﺮ ﻟﻠﺮﺳﻢ اﻟﺘﻮﺿﻴﺤﻲ ادﻧﺎﻩ(.
ان ﻣﺴﺘﻨﺴﺨﻨﺎ ﻋﺒﺎرة ﻋﻦ ﻛﺎﺋﻦ ﺑﺮﻣﺠﻲ ،ﻣﺜﻠﻪ ﻣﺜﻞ ﻛﺎﺋﻦ اﻟﻨﺎﻓﺬة،
وﻟﻜﻨﻪ ﻋﻠﻰ اﻟﻨﻘﻴﺾ ﻣﻦ ﻛﺎﺋﻦ اﻟﻨﺎﻓﺬة ﻓﻬﺬ اﳌﺴﺘﻨﺴﺦ ﻏﻴﺮ ﻇﺎﻫﺮ
ﺑﺼﺮﻳ َﺎ ﻋﻠﻰ اﻟﺸﺎﺷﺔ ﻣﺘﻰ ﻗﻤﻨﺎ ﺑﺘﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ .اﻧﻪ ﻣﺠﺮد ﻛﺎﺋﻦ
ﺑﺮﻣﺠﻲ ﻣﻮﺟﻮد ﻓﻲ ذاﻛﺮة اﳊﺎﺳﺐ ﻓﻘﻂ.
ﻣﺎ ان ﻳﺘﻠﻘﻰ ﻛﺎﺋﻨﻨﺎ اﳌﺴﺘﻨﺴﺦ ﺗﻠﻚ اﻟﺮﺳﺎﻟﺔ اﳌﺮﺳﻠﺔ اﻟﻴﻪ ﻣﻦ اﺣﺪ ﺗﻠﻚ
اﻻزرار ،ﺳﻴﺘﻢ ﻋﻨﺪﻫﺎ ﺗﻨﻔﻴﺬ اﻻﺟﺮاء اﳌﻄﻠﻮب .واﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻫﻨﺎ ﺗﺼﻮر ﻋﻦ اﻟﺒﺮﻧﺎﻣﺞ اﳌﺰﻣﻊ اﻧﺸﺎءﻩ.
ﻟﺬﻟﻚ اﻻﺟﺮاء ﺳﺘﻮﺟﺪ ﺑﺎﻟﺘﺼﻨﻴﻒ اﻟﻨﻤﻮذﺟﻲ اﻻﺻﻠﻲ )اي اﻧﻬﺎ
ﻓﻲ ﺣﺎل اﻟﻀﻐﻂ ﻋﻠﻰ اﺣﺪ ﺗﻠﻚ اﻻزرار ،ﺳﻮف ﻳﻘﻮم اﻻزرار
ﻟﻴﺴﺖ ﻣﻮﺟﻮدة ﺑﺎﳌﺴﺘﻨﺴﺦ(.
اﳌﻀﻐﻮط ﺑﺎرﺳﺎل رﺳﺎﻟﺔ .ﻫﺬﻩ اﻟﺮﺳﺎﻟﺔ ﲢﺘﻮي اﺳﻢ اﻻﺟﺮاء method
اﺛﻨﺎء اﻟﺘﻨﻔﻴﺬ ،ﺳﻴﻘﻮم ﻫﺬا اﻻﺟﺮاء ﺑﺎرﺳﺎل رﺳﺎﻟﺔ اﻟﻰ ﻛﺎﺋﻦ ﺣﻘﻞ اﳌﺰﻣﻊ ﺗﻨﻔﻴﺬﻩ .ﺗﺮى ﻫﺬﻩ اﻟﺮﺳﺎﻟﺔ ﺗﻮﺟﻪ اﻟﻰ ﻣﻦ أو ﻣﺎذا؟
اﻟﻨﺺ.ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ اﺳﻢ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ ،ﺗﻜﻮن ﺻﻴﻐﺔ اﻟﺮﺳﺎﻟﺔ
ﻓﻲ ﺣﺎﻟﺔ اﻟﻨﺎﻓﺬة ،ﻛﺎﻧﺖ رﺳﺎﻟﺔ اﻻﻏﻼق ﻣﻮﺟﻬﺔ اﻟﻰ ﻛﺎﺋﻦ اﻟﻨﺎﻓﺬة،
اﳌﺮﺳﻠﺔ ﻣﺤﺘﻮﻳﺔ ﻋﻠﻰ ﻣﺎ ﻳﻠﻲ دوﻣ َﺎ :اﺳﻢ اﻻﺟﺮاء )اﳋﺎص ﺑﺤﻘﻞ
واﻟﺬي ﺑﺪورﻩ ﻛﺎن ﻣﺴﺘﻨﺴﺦ instanceﻋﻦ ﺗﺼﻨﻴﻒ اﻟﻨﺎﻓﺬة اي
اﻟﻨﺺ(.
.window classﻣﺎ ﻧﺤﺘﺎﺟﺔ اﻻن ﻫﻮ ﻛﺎﺋﻦ ﻟﺪﻳﻪ اﻟﻘﺪرة ﻋﻠﻰ
ﻓﻮر ﺗﺴﻠﻢ ﺣﻘﻞ اﻟﻨﺺ ﻟﻠﺮﺳﺎﻟﺔ ﻳﺘﻢ اﻟﺘﻨﻔﻴﺬ ﻓﻮراَ .ﻓﻨﺤﻦ ﻧﺮﻳﺪ اﺳﺘﻘﺒﺎل اﻟﺮﺳﺎﺋﻞ ﻣﻦ اي ﻣﻦ ﻫﺆﻻء اﻻزرارﻳﻦ ،وﻛﺬﻟﻚ اﻟﻘﺪرة
ﻣﻦ ﺣﻘﻞ اﻟﻨﺺ ان ﻳﻌﺮض ﻗﻴﻤﺔ ﻧﺼﻴﺔ ﻣﻌﻴﻨﺔ ،ﺑﻨﺎء ﻋﻠﻰ اﻻزرار ﻟﺘﻮﺟﻴﻪ ﺣﻘﻞ اﻟﻨﺺ ﻟﻌﺮض ﻗﻴﻤﺔ ﻣﺎ.
اﳌﻀﻐﻮط .ﻟﺬا ﺳﺘﺤﺘﻮي اﻟﺮﺳﺎﻟﺔ ﻋﻠﻰ ُﻣﻌﺎﻣﻞ ) argumentﻗﻴﻤﺔ(
٥٣
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻛﻤﺎ ﺗﺮى ﻣﻦ اﻻﻳﻌﺎزات ،ﻳﻜﻮن اﻟﻘﻠﺐ اﻟﻨﺎﺑﺾ ﻟﻼﺟﺮاء ﻣﺤﺼﻮراَ ﺑﲔ ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ اﺳﻢ اﻟﻜﺎﺋﻦ اﻟﺬي ﺳﺘﺮﺳﻞ اﻟﻴﻪ اﻟﺮﺳﺎﻟﺔ ،واﺳﻢ اﻻﺟﺮاء
ﺗﻠﻚ اﻻﻗﻮاس اﳌﺮﺑﻌﺔ ;] [...ﻣﺘﺒﻮﻋﺔ ﺑﺘﻠﻚ اﻟﻔﺎﺻﻠﺔ اﳌﻨﻘﻮﻃﺔ اﻻﺑﺪﻳﺔ. اﳌﻄﻠﻮب ﺗﻨﻔﻴﺬﻩ ﺣﺘﻰ ﻳﺘﻤﻜﻦ ﺣﻘﻞ اﻟﻨﺺ ﻣﻦ اﻟﻘﻴﺎم ﺑﺪورﻩ.
داﺧﻞ ﺗﻠﻚ اﻻﻗﻮاس اﳌﺮﺑﻌﺔ ،ﻳﺘﻢ ذﻛﺮ اﺳﻢ اﻟﻜﺎﺋﻦ اﳌﺴﺘﻘﺒﻞ ﻟﻠﺮﺳﺎﻟﺔ
َ
اوﻻ ﻳﺘﺒﻌﻪ اﺳﻢ اﺣﺪ اﻻﺟﺮاءات اﻟﺘﻲ ﳝﻜﻨﻪ ﺗﻨﻔﻴﺬﻫﺎ .واذا ﻣﺎ ﺗﻄﻠﺐ
اﻻﺟﺮاء وﺟﻮد اﻛﺜﺮ ﻣﻦ ﻗﻴﻤﺔ او ﻣﻌﺎﻣﻞ ،وﺟﺐ ﺗﺰوﻳﺪﻩ ﺑﻬﺎ اﺟﺒﺎراَ
].[1.2
٥٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
٥٥
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
command- ﺑﺎﻟﻨﺎﻓﺬة اﻟﺴﻔﻠﻴﺔ اﻟﻴﺴﺮى( ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﳌﻔﺎﺗﻴﺢ ﺧﻠﻒ اﻟﻜﻮاﻟﻴﺲ ،ﺗﺆدي ﻋﻤﻠﻴﺔ اﻟﺴﺤﺐ واﻻﻓﻼت ﻟﻠﻜﺎﺋﻨﺎت
.shift-iﺗﻔﺤﺺ ﻧﺎﻓﺬة اﳋﺼﺎﺋﺺ واﺧﺘﺮ "ﻣﻼﻣﺢ "Attributesﻣﻦ -اﻻزرار ﻣﻦ ﻣﺨﺰﻧﻬﺎ اﻟﻰ اﻟﻨﺎﻓﺬة ،-ﺗﺆدي إﻟﻰ إﻧﺸﺎء ﻛﺎﺋﻦ ازرار
اﻟﻘﺎﺋﻤﺔ اﳌﻨﺴﺪﻟﺔ .pop-up menuﳝﻜﻨﻚ ﺗﻔﻌﻴﻞ ﻣﻼﻣﺢ اﻟﻨﻘﺸﺎت ﺟﺪﻳﺪ ﻋﻠﻰ اﻟﻨﺎﻓﺬة .وﻛﺬﻟﻚ اﳊﺎل ﻣﻊ ﺣﻘﻞ اﻟﻨﺺ واى ﻛﺎﺋﻦ آﺧﺮ
Textured Windowاﻟﺘﻲ ﺗﻮﻓﺮﻫﺎ اﻟﻨﺎﻓﺬة ،ﻫﺬا اﻟﺘﻔﻌﻴﻞ ﻳﺠﻌﻞ ﻗﺎﺑﻞ ﻟﻠﺴﺤﺐ واﻻﻓﻼت.
ﻧﺎﻓﺬﺗﻚ ﺗﺘﺨﺬ اﻟﺸﻜﻞ اﳌﻌﺪﻧﻲ ﻻﻇﻬﺎر ذاﺗﻬﺎ .ذﻟﻚ ﻳﻌﻨﻲ اﻣﻜﺎﻧﻴﺔ ﻻﺣﻆ ﻇﻬﻮر ﺗﻌﻠﻴﻖ ﻣﻘﺘﻀﺐ ﲟﺠﺮد اﻳﻘﺎف اﳌﺆﺷﺮ ﻋﻠﻰ اﺣﺪ ﺗﻠﻚ
ﺗﺨﺼﻴﺺ اﻟﻌﺮض اﻟﺒﺼﺮي ﻟﻌﺪد ﻛﺒﻴﺮ ﻣﻦ اﺟﺰاء ﺑﺮﻧﺎﻣﺞ دون اﳊﺎﺟﺔ اﻟﻜﺎﺋﻨﺎت ،ﺗﻌﻠﻴﻘﺎت ﻣﺜﻞ NSButtonأو . NSTextViewﺗﻠﻚ
ﻟﻜﺘﺎﺑﺔ اي ﺳﻄﺮ ﺑﺮﻣﺠﻲ! اﻟﺘﻌﻠﻴﻘﺎت ﲤﺜﻞ اﺳﻤﺎء اﻟﺘﺼﻨﻴﻔﺎت اﻟﺘﻲ ﲤﺜﻠﻬﺎ واﻟﺘﻲ اﻋﺪﺗﻬﺎ ﻟﻚ
أﭘﻞ ،وﻫﻲ ﺿﺮورﻳﺔ ﻟﺘﺄدﻳﺔ ﻋﺪد ﻣﻦ اﻟﻌﻤﻠﻴﺎت داﺧﻞ اﻟﺘﻄﺒﻴﻖ.
ﻗﻢ ﺑﺘﺮﺗﻴﺐ ﻣﻮﺿﻊ ﺗﻠﻚ اﻟﻜﺎﺋﻨﺎت داﺧﻞ ﻧﺎﻓﺬﺗﻚ .وﲢﺠﻴﻢ ﻣﺎ ﻳﻠﺰم.
ﻗﻢ ﺑﺘﻐﻴﻴﺮ ﻧﺼﻮص اﻻزرار ،وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻀﻐﻂ اﳌﺘﻜﺮر ﻋﻠﻰ
اﻻزرار.
ﻧﺪﻋﻮك ﻟﺘﻔﺤﺺ ﻧﺎﻓﺬة ﻣﺨﺰن اﻟﻜﺎﺋﻨﺎت ﺣﺘﻰ ﺗﺘﻤﺮس ﻋﻠﻰ ﻋﻤﻠﻴﺔ
اﺿﺎﻓﺔ اﻟﻜﺎﺋﻨﺎت إﻟﻰ اﻟﻨﺎﻓﺬة.
ﻟﺘﻐﻴﻴﺮ ﺧﺼﺎﺋﺺ propertiesاﺣﺪ اﻟﻜﺎﺋﻨﺎت ،اﺧﺘﺮ اﻟﻜﺎﺋﻦ اﳌﺮاد
ﺗﻐﻴﻴﺮ ﺧﺼﺎﺋﺼﺔ وذﻟﻚ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﳌﻔﺎﺗﻴﺢ .command-shift-i
ﻧﻨﺼﺤﻚ ﺑﺘﻔﺤﺺ ﺗﻠﻚ اﳋﺼﺎﺋﺺ اﻳﻀ َﺎ.
ﻛﻤﺜﺎل اﺧﺘﺮ اﻟﻨﺎﻓﺬ اﻟﺮﺋﻴﺴﺔ ”) “Windowﺳﻮف ﻳﺘﻢ اﻋﻼﻣﻚ
دﺗﻔﺤﺺ ﻧﺎﻓﺬﺗﻨﺎ ﻣﻦ ﺧﻼل ﺑﺮﻧﺎﻣﺞ .IB ﺑﺬﻟﻚ ﻣﺒﺎﺷﺮة ﻣﻦ ﺧﻼل وﺟﻮد ﲢﺪﻳﺪ ﺣﻮل ﻣﺴﺘﻨﺴﺦ اﻟﻨﺎﻓﺬة اﳌﺒﲔ
٥٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻓﺎﻧﺖ ﻟﻢ ﺗﻘﻢ ﺑﻜﺘﺎﺑﺔ أو ﺑﻨﺴﺦ اي ﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ﺗﺘﻌﺎﻣﻞ ﻣﻊ ﺗﻠﻚ ﻛﻤﺎ وﻋﺪﻧﺎك ﺳﺎﺑﻘ َﺎ،ﻧﺤﻦ ﻋﻠﻰ وﺷﻚ إﻧﺸﺎء ﺗﺼﻨﻴﻒ .classوﻟﻜﻦ
اﻟﺮﺳﺎﻟﺔ .اﻻﻣﺮ ﺑﺴﻴﻂ ﺟﺪاَ ﻫﻨﺎ ،ﻓﺎذا ﻣﺎ ﺗﻠﻘﻰ اﻟﺘﺼﻨﻴﻒ اﳉﺪﻳﺪ رﺳﺎﻟﺔ ﻗﺒﻞ اﻟﺒﺪء ﺑﺬﻟﻚ دﻋﻨﺎ ﻧﺘﻔﺤﺺ أﻟﻴﺔ ﻋﻤﻞ ﺗﻠﻚ اﻟﺘﺼﻨﻴﻔﺎت.
ﻣﺎ ﻟﺘﻨﻔﻴﺬ إﺣﺮاء ﻣﻌﲔ ﻟﻢ ﻧﻘﻢ ﺑﺎدﺧﺎل اي ﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ﳌﻌﺎﳉﺘﻪ، ﻓﻠﺘﻮﻓﻴﺮ اﳉﻬﻮد اﻟﺒﺮﻣﺠﻴﺔ ،ﻣﻦ اﻻﻓﻀﻞ داﺋﻤ َﺎ ان ﻧﺒﻨﻲ ﻋﻠﻰ ﻣﺎﺑﻨﺎﻩ
ﻋﻨﺪﻫﺎ ﺳﻴﺘﻢ ﺗﻮﺟﻴﻪ اﻟﺮﺳﺎﻟﺔ ﺑﺸﻜﻞ آﻟﻲ إﻟﻰ اي ﺗﺼﻨﻴﻒ اﻋﻠﻰ ﻣﻨﻪ اﻻﺧﺮونَ ،
ﺑﺪﻻ ﻣﻦ اﻟﺒﺪء ﻣﻦ ﻧﻘﻄﺔ اﻟﺼﻔﺮ ﻟﻨﻌﻴﺪ إﺧﺘﺮاع اﻟﺪاﺋﺮة .ﻓﺎن
ﺑﺴﻠﺴﻠﺔ اﻟﻮراﺛﺔ اي اﻟﺘﺼﻨﻴﻒ اﻟﺬي ورﺛﻨﺎ ﻣﻨﻪ ﺧﺼﺎﺋﺺ ﺗﺼﻨﻴﻔﻨﺎ ﻛﻨﺖ ﺑﺤﺎﺟﺔ ﻹﻧﺸﺎء ﻧﺎﻓﺬة ﺟﺪﻳﺪة ﺑﺨﺼﺎﺋﺺ وﺳﻠﻮﻛﻴﺎت ﺧﺎﺻﺔ
أو ﻣﺎ ﻧﻄﻠﻖ ﻋﻠﻴﻪ )”.(“superclass ﻼ ،ﻓﺎن ﻛﻞ ﻣﺎ ﻫﻮ ﻣﻄﻠﻮب ﻣﻨﻚ ﻫﻮ ﺗﺰوﻳﺪ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲﻣﺜ َ
ﻋﻨﺪ اﻟﻀﺮورة ،ﻳﺘﻢ اﻋﺎدة ﺗﻮﺟﻴﺔ ﻃﻠﺐ ﺗﻨﻔﻴﺬ اﻻﺟﺮاء ﺑﺎﲡﺎﻩ ﺗﻮﺻﻒ ﺗﻠﻚ اﳋﺼﺎﺋﺺ و اﻟﺴﻠﻮﻛﻴﺎت .وﻟﻦ ﺗﻜﻮن ﻣﻠﺰﻣ َﺎ ﻟﻜﺘﺎﺑﺔ اي
اﻟﺘﺼﻨﻴﻒ اﻻﻋﻠﻰ ﻓﺎﻻﻋﻠﻰ ،ﺣﺘﻰ ﻳﺘﻢ اﻳﺠﺎد ذﻟﻚ اﻻﺟﺮاء وﺗﻨﻔﻴﺬﻩ ﺷﻔﺮات ﺑﺮﻣﺠﻴﺔ ﻟﺘﻮﺻﻴﻒ ﻋﻤﻠﻴﺎت اﻻﻏﻼق ﻣﺜﻼ ،ﻻﻧﻬﺎ ﻣﻮﺟﻮد َة.
ﻣﻦ اﻋﻠﻰ اﻟﻬﺮم اﳌﻜﻮن ﻣﻨﻪ ﻫﺬا اﻟﺘﺼﻨﻴﻒ (top of the hierarchy ان اﻋﺘﻤﺎدك اﻟﺒﻨﺎء ﻋﻠﻰ ﻣﺎ ﻗﺎم اﻻﺧﺮون ﺑﺒﻨﺎﻩ ﻳﻜﺴﺒﻚ ﻛﺎﻓﺔ ﺗﻠﻚ
).of inheritance اﻟﺴﻠﻮﻛﻴﺎت اﳌﺒﻨﻴﺔ ﻣﺠﺎﻧﺎ دون ادﻧﻲ ﺟﻬﺪَ .وذﻟﻚ ﻣﺎ ﻳﺠﻌﻞ
ﻓﻲ ﺣﺎل ﻟﻢ ﻳﺘﻢ اﻟﻌﺜﻮر ﻋﻠﻰ ذﻟﻚ اﻻﺟﺮاء ﻧﻜﻮن ﻋﻨﺪﻫﺎ ﻗﺪ Objective-Cﻣﺨﺘﻠﻔﺔ اﻛﺜﺮ ﻋﻦ ﻟﻐﺔ Cاﻟﺼﺮﻓﺔ.
ارﺳﻠﻨﺎ رﺳﺎﻟﺔ ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﻤﻌﺎﳉﺔ .اﻧﻪ ﻣﺜﻞ ﻃﻠﺒﻚ ﻟﻌﻤﺎل ﻛﻴﻒ ﻳﺘﻢ ذﻟﻚ؟
ورﺷﺔ ان ﻳﻐﻴﺮوا دواﻟﻴﺐ زﻻﺟﺘﻚ اﻟﺜﻠﺠﻴﺔ -اﻟﺘﻲ ﻻﲢﺘﻮي اي ﻓﻲ اﳊﻘﻴﻘﺔ ،ﻫﻨﺎك ﺗﺼﻨﻴﻒ ﻟﻠﻨﺎﻓﺬة ﺑﺎﺳﻢ ، NSWindowﺣﻴﺚ
دواﻟﻴﺐ .-ﻓﻲ ﻫﺬﻩ اﳊﺎﻟﺔ ﺣﺘﻰ ﻣﺪﻳﺮ اﻟﻮرﺷﺔ ﻟﻦ ﻳﺴﺘﻄﻴﻊ ان ﳝﻜﻨﻚ ذﻟﻚ ان ﺗﺒﻨﻲ ﺗﺼﻨﻴﻒ ﺧﺎص ﺑﻚ ﺑﺤﻴﺚ ﻳﺴﺘﻘﻰ )ﻳﺮث ّ
ﻳﻘﺪم ﻟﻚ ﺷﻲء .ﺗﻘﻮم Objective-Cﻓﻲ ﻣﺜﻞ ﻫﺬﻩ اﳊﺎﻻت (inheritsﻛﺎﻓﺔ ﺧﺼﺎﺋﺺ اﻟﺘﺼﻨﻴﻒ اﻻول اي .NSWindow
ﺑﺎﺻﺪار رﺳﺎﻟﺔ ﺧﻄﺎء. واﻻن ﻟﻨﻔﺘﺮض اﻧﻚ ﺗﺮﻏﺐ ﺑﺎﺿﺎﻓﺔ ﺳﻠﻮك ﺟﺪﻳﺪ ﻟﺘﺼﻨﻴﻔﻚ اﳌﺒﻨﻲ
ﻣﺎذا ﻟﻮ رﻏﺒﺖ ﺑﺘﻌﺪﻳﻞ اﺣﺪ اﻟﺴﻠﻮﻛﻴﺎت أو اﻻﺟﺮاءات اﳌﻮروﺛﺔ ﻣﻦ ﻋﻠﻰ ﺗﺼﻨﻴﻒ اﻟﻨﺎﻓﺬة .ﻣﺎﻟﺬي ﺳﻴﺤﺪث ﻟﻮ ﺗﻠﻘﻰ ﺗﺼﻨﻴﻒ ﻧﺎﻓﺬﺗﻨﺎ
ﺗﺼﻨﻴﻔﻚ اﻻب ﻓﻲ ﺗﺼﻨﻴﻔﻚ اﳊﺎﻟﻲ؟ اﳉﺪﻳﺪ رﺳﺎﻟﺔ اﻻﻏﻼق ” “close؟
٥٧
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﺑﺎﻗﻲ اﻟﻜﺎﺋﻨﺎت ﻓﻤﻨﻪ ﻳﺘﺤﺪر اﳉﻤﻴﻊ وﻣﻨﻪ ﻳﺴﺘﻘﻮن ﺗﻮﺻﻴﻔﺎﺗﻬﻢ، ذﻟﻚ اﻣﺮ ﻳﺴﻴﺮ ،ﺣﻴﺚ ﳝﻜﻨﻚ دوﻣ َﺎ ﺗﻜﻴﻴﻒ -override-ﺗﻠﻚ
وﺟﻤﻴﻌﻬﻢ ﻳﺤﺘﻔﻈﻮن ﺑﺨﺼﺎﺋﺼﻪ وﺳﻠﻮﻛﻴﺎﺗﻪ وراﺛﻴ َﺎ .اﻧﻪ اﻟﺘﺼﻨﻴﻒ اﻻﺟﺮاءات .ﻛﻤﺜﺎل ﳝﻜﻨﻚ اﻋﺎدة ﺗﻜﻴﻴﻒ اﻻﺟﺮاء ، closeاﻟﺬي
اﻻب ﻟﻜﺎﻓﺔ اﻟﺘﺼﻨﻴﻔﺎت subclassesاﻟﺘﻲ ﺗﺮث ﻣﻨﻪ ﺳﻮاء ﺑﺸﻜﻞ ﻳﺠﻌﻞ اﻟﻨﺎﻓﺬة ﺗﺨﻔﻲ ذاﺗﻬﺎ ﺑﺼﺮﻳ َﺎ ﺑﺤﻴﺚ ﻳﻜﻮن إﺟﺮاء اﻻﻏﻼق ﻋﺒﺎرة
ﻣﺒﺎﺷﺮ أو ﻏﻴﺮ ﻣﺒﺎﺷﺮ.ﻛﻤﺜﺎل ﳒﺪ ان اﻟﺘﺼﻨﻴﻒ NSWindow ﻋﻦ ﺗﻨﺤﻴﺔ وﺗﻐﻴﻴﺮ ﳌﻮﻗﻊ اﻟﻨﺎﻓﺬة ﺛﻢ اﻏﻼﻗﻬﺎ .ان اﻟﺘﺼﻨﻴﻒ اﻟﻜﺎﺋﻨﻲ
ﺗﺼﻨﻴﻒ ﻣﺘﺤﺪر ﻣﻦ ﺳﻼﻟﺔ اﻟﺘﺼﻨﻴﻒ NSResponderوﻫﺬا ﻟﻨﺎﻓﺬﺗﻚ ﻳﺴﺘﺨﺪم ذات اﻻﺳﻢ اﳌﻌﺮف ﻟﻼﻏﻼق واﻟﺬي اﻋﺪﺗﻪ ﻟﻚ
اﻻﺧﻴﺮ ﻣﺘﺤﺪر ﻣﻦ ﺳﻼﻟﺔ اﻟﺘﺼﻨﻴﻒ اﻻب .NSObject أﭘﻞ .ﻟﺬا ﻣﺎ ان ﻳﺘﻢ ﺗﻮﺟﻴﻪ رﺳﺎﻟﺔ إﺟﺮاء اﻻﻏﻼق ﻟﻨﺎﻓﺬﺗﻚ ،ﻓﺎﻧﻬﺎ
ان اﻟﺘﺼﻨﻴﻒ اﻻب NSObjectﻳﻮﺻﻒ اﻓﻌﺎل ﻣﺘﺠﺎﻧﺴﺔ وﻣﻌﻤﻤﺔ ﺳﻮف ﺗﺘﻨﺤﻰ وﺗﻐﻴﺮ ﻣﻮﻗﻌﻬﺎ ﻣﻦ اﻟﺸﺎﺷﺔ ﺛﻢ ﺗﻐﻠﻖ ذاﺗﻬﺎ.
داﺧﻞ اﻟﻜﺎﺋﻨﺎت اﻟﺘﻲ ﺗﺴﺘﻘﻲ/ﺗﺮث ﻣﻨﻪ )ﻛﺈﻧﺸﺎء ﻧﺺ ﻳﺼﻒ ﻧﻮع ان ﻋﻤﻠﻴﺔ اﻏﻼق اﻟﻨﺎﻓﺬة ﻟﺬاﺗﻬﺎ إﺟﺮاء ﻣﺒﺮﻣﺞ ﻣﺴﺒﻘ َﺎ ﻣﻦ ﻗﺒﻞ أﭘﻞ.
اﻟﻜﺎﺋﻦ ،أو ﻗﺎﺑﻠﻴﺔ اﺟﺮاء اﺳﺘﻔﺴﺎر ﻣﺎ اذا ﻛﺎن اﻟﻜﺎﺋﻦ ﻗﺎدر ﻋﻠﻰ ﺗﻠﻘﻲ ﻓﻤﻦ داﺧﻞ ﻧﻄﺎق ﺗﻌﺮﻳﻔﻨﺎ ﻟﺬات اﻻﺟﺮاء close methodﻗﻤﻨﺎ
رﺳﺎﻟﺔ ﻣﺎ ..اﻟﺦ( ﻗﺒﻞ ان اﺿﺠﺮك ﺑﺎﻟﻌﺪﻳﺪ ﻣﻦ اﻟﻨﻈﺮﻳﺎت ،دﻋﻨﺎ ﻧﺮى ﺑﺎﺳﺘﺪﻋﺎء اﻻﺟﺮاء اﻻﺻﻠﻲ ﻟﻼﻏﻼق وﻫﻮ اﳌﻮروث ﻣﻦ اﻟﻨﻤﻮذج
ﻛﻴﻒ ُﻳﻨﺸﺄ اﻟﺘﺼﻨﻴﻒ .create a class اﻻب superclassﻟﻠﻨﺎﻓﺬة .ﻫﻨﺎك ﺗﻐﻴﻴﺮات ﻃﻔﻴﻔﺔ ﻣﻄﻠﻮﺑﺔ ﺣﺘﻰ
ﺗﻮﺟﺔ اﻟﻰ ﻧﺎﻓﺬة MainMenu.nibواﺧﺘﺮ ﺑﻨﺪ اﻟﺘﺼﻨﻴﻔﺎت .Classes ﻧﻀﻤﻦ اﻻﻳﻜﻮن ﻫﻨﺎك ﺗﻌﺎودﻳﺔ recursiveاﺛﻨﺎء اﺳﺘﺪﻋﺎء اﻻﺟﺮاء.
ﺳﺘﺠﺪ رأس اﻟﻬﺮم NSObjectﻓﻲ اﻟﻌﻤﻮد اﻻول .اﺧﺘﺮ ﻫﺬا اﻟﺘﺼﻨﻴﻒ ][2
// Code to move the window out of sight
ﺛﻢ ﺗﻮﺟﻪ اﻟﻰ اﻟﻘﺎﺋﻤﺔ اﻟﻌﻠﻴﺎ menubarﺣﻴﺚ ﲡﺪ ﻗﺎﺋﻤﺔ Classes here.
.menuوﻣﻦ ﻫﻨﺎك اﺧﺘﺮ ﺗﻔﻌﻴﻞ اﻣﺮ ، Subclass NSObjectﻫﺬا [super close]; // Use the close method of
the superclass.
اﻻﻣﺮ ﺳﻴﻨﺸﻲء ﺗﺼﻨﻴﻒ ﻳﺮث ﺻﻔﺎت اﻟﻨﻤﻮذج اﻻب .ﻗﻢ ﺑﺎﻟﻌﻮدة
ﻣﺮة أﺧﺮى اﻟﻰ ،MainMenu.nibواﻃﻠﻖ ﻋﻠﻰ اﻟﺘﺼﻨﻴﻒ اﳉﺪﻳﺪ ﻫﺬا اﳌﻔﻬﻮم اﻟﺒﺮﻣﺠﻲ ﻣﺘﻘﺪم ﺟﺪاَ ﻻن ﻳﻮﺟﺪ ﺑﻜﺘﺎب ﻟﻠﻤﺒﺘﺪﺋﲔ،
اﺳﻤ َﺎ ذي دﻻﻟﺔ ،ﻋﻦ ﻧﻔﺴﻲ اﻃﻠﻘﺖ ﻋﻠﻰ اﻟﺘﺼﻨﻴﻒ اﳉﺪﻳﺪ اﺳﻢ ﻟﺬا ﻟﻦ ﻧﺘﻮﻗﻊ ﻣﻨﻚ ان ﺗﺴﺘﻮﻋﺒﻪ ﺑﺒﻀﻌﺔ اﺳﻄﺮ ﺧﺎﻟﻴﺔ ﻣﻦ اﻟﺪﺳﻢ.
”.“MAFoo ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﻜﺎﺋﻨﺎت اﻟﺒﺮﻣﺠﻴﺔُ ،ﻳﻌﺪ NSObjectاﺻﻞ ﻧﺸﺄة ووﺟﻮد
٥٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻣﺘﻰ ﻗﻤﺖ ﺑﺈﻧﺸﺎء ﺗﺼﻨﻴﻒ ﺟﺪﻳﺪ ،اﺣﺮص ﻋﻠﻰ اﻋﻄﺎءﻩ اﺳﻤ َﺎ ذي
دﻻﻟﺔ وﻣﻌﻨﻰ ﻣﻮﺟﺰ ﻋﻦ دورﻩ .ﻛﻤﺜﺎل وﻛﻤﺎ رأﻳﻨﺎ ﻓﻲ ﺗﺼﻨﻴﻔﺎت إﻧﺸﺎء ﺗﺼﻨﻴﻒ ”“MAFoo class
Cocoaﺣﻴﺚ ﻛﺎن ﺗﺼﻨﻴﻒ اﻟﻨﺎﻓﺬة ﻣﺘﺨﺬاَ اﻻﺳﻢ NSWindow
.ﻣﺜﺎل آﺧﺮ ﻋﻦ ﺗﺼﻨﻴﻒ ﻳﺨﺘﺺ ﺑﺈﻇﻬﺎر اﻻﻟﻮان وﻫﻮ ﲢﺖ اﺳﻢ ﺳﺘﻠﺤﻆ وﺟﻮد ﺣﺮﻓﲔ ﻛﺒﻴﺮﻳﻦ Capitalﺿﻤﻦ اﺳﻢ ﻣﺼﻨﻔﻨﺎ ،اﻧﻬﻤﺎ
. NSColorﻓﻲ ﺣﺎﻟﺘﻨﺎ ﻳﻌﺪ اﺳﻢ اﻟﺘﺼﻨﻴﻒ MAFooاﻟﺬي ﻗﻤﻨﺎ اﺧﺘﺰال اﺑﺘﻜﺮﻧﺎﻩ ﻟﻼﺷﺎرة اﻟﻰ ” .“My Applicationﳝﻜﻨﻚ اﺧﺘﺮاع
ﺑﺈﻧﺸﺎءﻩ ﻣﺠﺮد ﻣﺜﺎل ﻟﺸﺮح اﻟﻄﺮﻳﻘﺔ اﻟﺘﻲ ﺳﻴﺘﻌﺎﻣﻞ ﺑﻬﺎ اﻟﺒﺮﻧﺎﻣﺞ ﻣﻊ ﻣﺎ ﺗﺮاﻩ ﻣﻨﺎﺳﺒ َﺎ ﻣﻦ اﻻﺳﻤﺎء ﳌﺼﻨﻔﺎﺗﻚ .ﻗﺒﻞ ان ﺗﺒﺪأ اﻟﻌﻤﻞ ﺑﻜﺘﺎﺑﺔ
ﻫﺬا اﻟﺘﺼﻨﻴﻒ .ﻟﺬا اﻃﻠﻘﻨﺎ ﻋﻠﻴﻪ ﻫﺬا اﻻﺳﻢ اﻟﻌﺒﺜﻲ دون اﻟﺪﻻﻟﺔ ﻻي ﺷﻔﺮة ﺑﺮﻧﺎﻣﺠﻚ ﻧﻨﺼﺤﻚ ﺑﺎن ﺗﺘﺨﺬ ﻣﻨﻬﺞ ﺗﺴﻤﻴﺔ ﻣﺸﺎﺑﻪ) .ﲟﻌﻨﻰ
دور ﻳﻘﻮم ﺑﻪ. اﺧﺘﻴﺎر ﺣﺮﻓﺎن أو ﺛﻼﺛﺔ ﻟﺘﻤﻴﻴﺰ ﻣﺼﻨﻔﺎﺗﻚ وﲡﻨﺐ ازدواﺟﻴﺔ ﺗﺼﺎدم
اﳌﺴﻤﻴﺎت ﻣﻊ اﳌﺼﻨﻔﺎت اﳌﻮﺟﻮدة أو اﻟﺘﻲ ﻳﺘﻢ اﺳﺘﻌﺎرﺗﻬﺎ وﺗﻀﻤﻴﻨﻬﺎ
ﺑﺎﻟﻌﻮدة اﻟﻰ ﺑﺮﻧﺎﻣﺞ ، IBﻗﻢ ﺑﺎﺧﺘﻴﺎر إﺳﺘﻨﺴﺎخ Instantiateﻟﻌﻤﻞ ﻣﻦ ﻗﺒﻞ ﻣﺒﺮﻣﺠﲔ آﺧﺮﻳﻦ( .ﻋﻠﻰ ﻛﻞ ﺣﺎل ﲡﻨﺐ اﺳﺘﺨﺪم ﺑﺎدﺋﺔ
ﻣﺴﺘﻨﺴﺦ ﻣﻦ ﺗﺼﻨﻴﻒ MAFooاﻟﺬي ﺳﺘﺠﺪﻩ ﻗﺪ اﺿﻴﻒ داﺧﻞ
٥٩
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
رﺳﺎﺋﻞ ﻣﻮﺟﻬﺔ ﻣﻨﻪ ﺷﺨﺼﻴ َﺎ اﻟﻰ ﺣﻘﻞ اﻟﻨﺺ ،ذﻟﻚ ﺿﺮوري ﻻن ﻗﺎﺋﻤﺔ اﻟﺘﺼﻨﻴﻔﺎت ، .Classes menuﻛﻤﺎ ﺳﺘﺮى ادﻧﻰ ﻟﻮﻳﺤﺔ
ﺣﻘﻞ اﻟﻨﺺ ﻛﺎﺋﻦ ﻳﺴﺘﻘﺒﻞ اﻟﺮﺳﺎﺋﻞ. اﳌﺴﺘﻨﺴﺨﺎت ،Instances tabﻟﺪﻳﻚ اﻻن اﻳﻘﻮﻧﺔ ﺟﺪﻳﺪة ﺑﺎﺳﻢ
ان اي ﻛﺎﺋﻦ ﻏﻴﺮ ﻗﺎدر ﻋﻠﻰ اﻟﺘﻮاﺻﻞ ﻣﻊ اﻟﻜﺎﺋﻨﺎت اﻻﺧﺮى ﻓﻲ .MAFooﻫﺬﻩ اﻻﻳﻘﻮﻧﺔ ﺗﻘﻮم ﻣﻘﺎم اﳌﺴﺘﻨﺴﺦ اﳉﺪﻳﺪ اﻟﺬي ﻗﻤﺖ
ﻇﻞ ﻋﺪم وﺟﻮد ﺗﻮﺻﻴﻠﺔ ﻣﺮﺟﻌﻴﺔ referenceﺗﺪﻟﻪ ﻋﻠﻰ اﻟﻜﺎﺋﻦ ﺑﺈﻧﺸﺎءﻩ.
اﳌﺴﺘﻘﺒﻞ.
ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺎﻟﺘﻮﺻﻴﻞ ﻣﺎ ﺑﲔ اﻻزرار وﻣﺼﻨﻔﻨﺎ اﻟﻜﺎﺋﻦ ،MAFoo
ﻓﺈﻧﻨﺎ ﺑﺬﻟﻚ ﻧﺰود اﻻزرار ﺑﺎﺷﺎرة ﻣﺮﺟﻌﻴﺔ ﻛﺠﺴﺮ ﺗﻮاﺻﻞ ﺗﺸﻴﺮ
ﻟﻠﻜﺎﺋﻦ .MAFooاﻻزرار ﻫﻨﺎ ﺳﻴﺘﻤﻜﻦ ﻣﻦ ارﺳﺎل اﻟﺮﺳﺎﻟﺔ اﻟﻰ
اﻟﻜﺎﺋﻦ .MAFooوﺑﺎﳌﻘﺎﺑﻞ ﻛﺎﺋﻨﻨﺎ MAFooﺳﻴﺤﺘﺎج ﳌﺪ ﺟﺴﺮ
اﻟﺘﻮاﺻﻞ ﻣﻊ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ ،ﺣﺘﻰ ﻳﺘﻤﻜﻦ اﻻﺧﻴﺮ ﻣﻦ ﺗﻠﻘﻲ
اﻟﺮﺳﺎﻟﺔ واﻻﻣﺘﺜﺎل ﻟﻬﺎ.
دﻋﻨﺎ ﻧﻮاﻛﺐ ﻣﺎ ﻳﻘﻮم ﺑﻪ اﻟﺒﺮﻧﺎﻣﺞ ﻣﺮة اﺧﺮى .ان ﻛﻞ ازرار ﻣﻦ اﻻزارﻳﺮ
ﻼ ﻟﻀﻐﻄﺔ ﻫﻨﺎ ﻗﺎدر ﻋﻠﻰ ارﺳﺎل رﺳﺎﻟﺔ ﳊﺪث ﻓﺮﻳﺪ ﻛﺮد ﻓﻌﻞ ﻣﺜ َ
ﻣﺆﺷﺮ اﳌﺎوس اﻟﺬي ﰎ ﻋﻠﻰ ذﻟﻚ اﻻزرار .ﻣﺘﻰ ﰎ ﺿﻐﻂ اﻻزرار ﻗﺎم
اﻻﺧﻴﺮ ﺑﺎرﺳﺎل رﺳﺎﻟﺔ ﺑﻨﺎء ﻋﻠﻰ ذﻟﻚ اﳊﺪث .ﻫﺬﻩ اﻟﺮﺳﺎﻟﺔ ﲢﺘﻮي إﻧﺸﺎء ﻣﺴﺘﻨﺴﺦ MAFoo
ﻣﺎﻳﻠﻲ: ﺧﻄﻮﺗﻨﺎ اﻟﺘﺎﻟﻴﺔ ﺣﻮل إﻧﺸﺎء ﺗﻮﺻﻴﻼت ﻣﺎ ﺑﲔ اﻻزرار )اﻟﺘﻲ ﺳﺘﻘﻮم
-اﺳﻢ اﻻﺟﺮاء اﳌﺮاد ﺗﻨﻔﻴﺬﻩ ﻣﻦ اﻟﺘﺼﻨﻴﻒ MAFooاﻟﺬي ﺳﻴﻘﻮم ﺑﺎرﺳﺎل اﻟﺮﺳﺎﻟﺔ( اﻟﻰ ﻛﺎﺋﻦ ) MAFooاﻟﺬي ﺳﻴﺘﻠﻘﻰ ﺗﻠﻚ اﻟﺮﺳﺎﺋﻞ(.
ﻓﻌﻠﻴ َﺎ ﺑﺘﻨﻔﻴﺬ اﻻﻣﺮ. ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ ذﻟﻚ ،ﺳﻨﻘﻮم ﺑﺠﻌﻞ ﻛﺎﺋﻦ MAFooﻗﺎدراَ ﻋﻠﻰ ارﺳﺎل
٦٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻣﻦ ﺧﻼل ارﺳﺎل اﻟﺮﺳﺎﺋﻞ اﻟﻴﻪ. -ﻫﺬﻩ اﻟﺮﺳﺎﻟﺔ ﺗﻮﺟﻪ اﻟﻰ اﻟﻜﺎﺋﻦ اﳌﺴﺘﻨﺴﺦ ﻣﻦ اﻟﺘﺼﻨﻴﻒ MAFoo
iﺣﺘﻰ ﺗﻈﻬﺮ ﻟﻚ ﻧﺎﻓﺬة ﺗﺪﻗﻴﻖ اﳋﺼﺎﺋﺺ اﳋﺎﺻﺔ ﺑﻬﺬا اﻟﺘﺼﻨﻴﻒ. ﻟﺪﻳﻪ اﳋﺒﺮ اﻟﻴﻘﲔ
Action tab ﻓﻲ ﻧﺎﻓﺬة ﺗﺪﻗﻴﻖ اﳋﺼﺎﺋﺺ ،اﺧﺘﺮ ﻟﻮﻳﺤﺔ اﻻﻓﻌﺎل ﻟﺬا ﻣﺎ ﻳﺠﺮي ﻫﻨﺎ ﻫﻮ ان ﻳﺘﻢ ﺗﻮﺟﻴﺔ اﻟﺮﺳﺎﻟﺔ اﻟﻰ اﻟﻜﺎﺋﻦ اﳌﺴﺘﻨﺴﺦ
واﺿﻐﻂ اﻻزرار اﳌﻌﻨﻮن ﺑـ Addﺣﺘﻰ ﳝﻜﻨﻚ اﺿﺎﻓﺔ اﻻﺟﺮاء )ﻳﻄﻠﻖ MAFooواﻟﺬي ﺑﺪورﻩ ﺳﻴﻘﻮم ﺑﺮﻓﻌﻬﺎ اﻟﻰ ﻣﻮﺻﻒ ﺗﺼﻨﻴﻔﻪ اي
ﻋﻠﻴﻪ Actionأو methodوﻛﻼﻫﻤﺎ ﻧﻔﺲ اﳌﻌﻨﻰ( اﻟﻰ ﺗﺼﻨﻴﻔﻨﺎ . MAFooوﻣﻦ ﻫﻨﺎك ﺳﻴﺘﻢ ﺗﻮﺟﻴﺔ ﺗﻠﻚ اﻟﺮﺳﺎﻟﺔ اﻟﻰ ﻛﺎﺋﻦ ﺣﻘﻞ
اﻟﻨﺺ.
ﻗﻢ ﺑﺘﻐﻴﻴﺮ اﻻﺳﻢ اﻻﻓﺘﺮاﺿﻲ ﻟﻺﺟﺮاء اﳌﻀﺎف ﺑﺎﺳﻢ ذي دﻻﻟﺔ وﺻﻔﻴﺔ
ﻣﺜﻞ ”- “setTo5:ذﻟﻚ اﻧﻨﺎ ﺳﻨﺒﺮﻣﺞ اﻟﻔﻌﻞ ﻟﻴﻌﺮض اﻟﻌﺪد ٥ﻛﻨﺺ ﻣﺜﻠﻬﺎ ﻣﺜﻞ اي رﺳﺎﻟﺔ ،ﻫﺬﻩ اﻟﺮﺳﺎﻟﺔ ﻣﻜﻮﻧﺔ ﻣﻦ اﺳﻢ اﻻﺟﺮاء method،
داﺧﻞ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ -ﺛﻢ ﻗﻢ ﺑﺎﺿﺎﻓﺔ إﺣﺮاء آﺧﺮ وﻗﻢ ﺑﺘﺴﻤﻴﺘﻪ وﻫﻮ ﻓﻲ ﻫﺬﻩ اﳊﺎﻟﺔ اﻻﺟﺮاء اﻟﺬي ﻳﺄﻣﺮ ﺣﻘﻞ اﻟﻨﺺ ﺑﻌﺮض اﻟﻘﻴﻤﺔ
” - “reset:ﻋﻠﻰ ﺳﺒﻴﻞ اﳌﺜﺎل ذﻟﻚ اﻧﻨﺎ ﺳﻨﺒﺮﻣﺞ ﻫﺬا اﻻﺟﺮاء ﻟﻴﻌﺮض ﻓﻲ اﻃﺎرﻩ .ان اﻟﻘﻴﻤﺔ اﳌﺮﺳﻠﺔ ﺗﻌﺪ ﺟﺰء ﻣﻦ ﺗﻜﻮﻳﻦ اﻟﺮﺳﺎﻟﺔ ،ﺑﺎﻻﺿﺎﻓﺔ
ﻗﻴﻤﺔ ﺻﻔﺮ ﺑﺤﻘﻞ اﻟﻨﺺ.- اﻟﻰ اﻻﺳﻢ اﻟﺬي ﺳﻴ ّﻨﺸﻂ ﺣﻘﻞ اﻟﻨﺺ ﻟﺘﻐﻴﻴﺮ ﻣﺤﺘﻮاﻩ.
وﻻﺣﻆ ان ﻛﺎﻓﺔ اﻻﺟﺮاءات اﳌﺴﺘﺤﺪﺛﺔ ﻫﺬﻩ ﺗﻨﺘﻬﻲ ﺑﻨﻘﺘﻄﲔ ﻟﺬا ﺗﺼﻨﻴﻔﻨﺎ MAFooﺑﺤﺎﺟﺔ ﻟﺘﻌﺮﻳﻒ إﺟﺮاﺋﲔ ﻳﻄﻠﻖ ﻋﻠﻴﻬﻤﺎ
ﻋﻤﻮدﻳﺘﲔ)” .(“:اﳌﺰﻳﺪ ﻣﻦ اﳌﻌﻠﻮﻣﺎت ﻻﺣﻘ َﺎ. actionsﺣﻴﺚ ﺳﻴﺘﻢ اﺳﺘﺪﻋﺎﺋﻬﻤﺎ ﻣﻦ ﺧﻼل ﻛﺎﺋﻨﻲ اﻻزرارﻳﻦ.
وﺗﺼﻨﻴﻔﻨﺎ MAFooﺑﺤﺎﺟﺔ ﻟﺘﻌﺮﻳﻒ ﻣﻨﻔﺬ ﺧﺮج واﺣﺪ )،(outlet
وﻣﻨﻔﺬ اﳋﺮج ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﻴﺮ ﻳﺤﺘﻔﻆ ﺑﻌﻨﻮان اﻟﻜﺎﺋﻦ اﻟﺬي ﺳﻴﺘﻢ
اﻟﺘﻮاﺻﻞ ﻣﻌﻪ )ﻓﻲ ﺣﺎﻟﺘﻨﺎ ﻫﺬﻩ ﺣﻘﻞ اﻟﻨﺺ ﻫﻮ ذﻟﻚ اﻟﻜﺎﺋﻦ( وذﻟﻚ
٦١
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻗﺒﻞ اﻟﺒﺪء ﺑﻌﻤﻞ اﻟﺘﻮﺻﻴﻼت اﻟﻼزﻣﺔ ﺑﲔ اﻟﻜﺎﺋﻨﺎت ،ﻳﺠﺪر ﺑﻨﺎ Outlet اﻻن واﻧﺖ ﺑﻨﺎﻓﺬة ﺗﺪﻗﻴﻖ اﳋﺼﺎﺋﺺ ،اﺧﺘﺮ ﻟﻮﻳﺤﺔ اﳋﺮج
اﻋﻄﺎء اﻻزرارﻳﻦ اﺳﻤﺎء ذات دﻻﻟﺔ.وﲟﺎ ان اﻻزرار اﻻول ﺳﻴﻘﻮم ،tabوﻗﻢ ﺑﺈﺿﺎﻓﺔ ﻣﺨﺮج outletواﻃﻠﻖ ﻋﻠﻴﻪ اﺳﻢ ”“textField
ﺑﺎﻟﻄﻠﺐ ﻣﻦ ﻣﺴﺘﻨﺴﺦ MAFooان ﻳﻌﺮض اﻟﻌﺪد ٥ﺑﺤﻘﻞ اﻟﻨﺺ، ﻼ.ﻣﺜ َ
ﻟﺬا ﺳﻨﻘﻮم ﺑﺘﺴﻤﻴﺔ اﻻزرار ”- “Set to 5ﻧﺤﻦ ﻧﻌﻠﻢ ﻛﻴﻔﻴﺔ ﻋﻤﻞ
ذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻀﻐﻂ اﳌﺘﺘﺎﻟﻲ ﻋﻠﻰ اﻻزرار ﺛﻢ ﺗﻐﻴﻴﺮ اﻟﻨﺺ اﻟﻰ
اﻻﺳﻢ اﳉﺪﻳﺪ .-ﻛﺮر اﻻﻣﺮ ذاﺗﻪ ﻣﻊ اﻻزرار اﻟﺜﺎﻧﻲ ،ﺣﻴﺚ ﺳﻨﻄﻠﻖ
ﻋﻠﻴﻪ اﺳﻢ ”. “Reset
٦٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
٦٣
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٦٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
ﻼ ،ﺣﻴﺚ اﻟﻔﺼﻞ ،٤ﻋﻨﺪﻣﺎ ﻧﺎﻗﺸﻨﺎ وﻇﻴﻔﺔ دﻋﻨﺎ ﻧﻌﻮد ﻟﻠﻮراء ﻗﻠﻴ َ
اﻟﺪاﻻت .ﻫﻞ ﺗﺘﺬﻛﺮ ﻧﻘﺎﺷﻨﺎ ﺣﻮل ﺗﺮوﻳﺴﺔ اﻟﺪاﻟﺔ function
إﻧﺸﺎء اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻟﻠﺘﺼﻨﻴﻒ MAFoo
headerﺑﺎﳌﺜﺎل ][11.1؟ ﻟﻘﺪ ﻛﺎﻧﺖ ﲟﺜﺎﺑﺔ ﺗﺼﺮﻳﺢ اﺧﺒﺎري ﻟﻠﻤﺮﻛﻢ،
ﺗﺨﺒﺮة ﻋﻤﺎ ﻗﺪ ﻳﺼﺎدﻓﺔ ﻣﻦ اﻋﻼﻧﺎت وﺗﻌﺎرﻳﻒ ﻋﻦ اﻟﺪوال واﻧﻮاع اﻻن ﻗﻢ ﺑﺎﻟﻌﻮدة اﻟﻰ ﺑﺮﻧﺎﻣﺞ Xcode،وﺳﻮف ﺗﺮى ان اﳌﻠﻔﺎت اﻟﺘﻲ
أﻧﺸﺄﺗﻬﺎ ﻣﻮﺟﻮدة داﺧﻞ ﻧﺎﻓﺬة اﳌﺸﺮوع ،ﲟﺠﻠﺪ اﳌﺼﺎدر اﻻﺧﺮى Other
اﳌﻌﺎﻣﻼت.
.Sources groupﺣﻴﺚ ﳝﻜﻨﻚ ﺳﺤﺐ ﻫﺬﻩ اﳌﻠﻔﺎت وادراﺟﻬﺎ
إن اﺣﺪ ﻣﻠﻔﺎﺗﻨﺎ اﳌﻨﺸﺎءة ﻣﺆﺧﺮاَ ﻳﺤﻤﻞ اﻻﺳﻢ MAFoo.hوﺗﺮوﻳﺴﺔ ﲟﺠﻠﺪ اﻟﺘﺼﻨﻴﻔﺎت Classes groupﻓﻲ ﺣﺎل اﻟﺮﻏﺒﺔ ،ﻓﻜﻤﺎ ﺗﺮى ان
ﺗﻮﺻﻒ ﻫﺬا اﻟﺘﺼﻨﻴﻒ .ﻓﻔﻲ ذﻟﻚ اﳌﻠﻒ ﲢﻮي اﳌﻌﻠﻮﻣﺎت اﻟﺘﻲ ّ ﻫﺬﻩ اﳌﻠﻔﺎت اﳊﺪﻳﺜﺔ اﻹﻧﺸﺎء ﲤﺜﻞ ﺗﻮﺻﻴﻒ اﻟﺘﺼﻨﻴﻒ .MAFoo
٦٥
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﺑﺎرﺳﺎل اﻟﺮﺳﺎﻟﺔ :ﻓﻘﻂ و اﻟﺘﻲ ﻻ ﺗﺘﻄﻠﺐ اي رد ﻳﻠﻴﻬﺎ ﻋﻨﺪ ارﺳﺎﻟﻬﺎ اﻟﺴﻄﺮ ] [3.5ﲡﺪ ﻛﻠﻤﺔ NSObjectاﳌﺄﻟﻮﻓﺔ ﻟﺪﻳﻚ ،واﻟﺘﻲ ﺗﺨﺒﺮﻧﺎ
اﻟﻰ اﻟﻜﺎﺋﻦ . MAFoo اﳌﺠﻤﻊ ان ﻫﺬا اﻟﺘﺼﻨﻴﻒ ﻳﺴﺘﻘﻲ/ﻳﺮث ﺻﻔﺎﺗﻪ ﻣﻦ اﻟﺘﺼﻨﻴﻒوﺗﺨﺒﺮ ّ
ﺳﺘﺮى اﻳﻀ َﺎ ﻋﺪد اﺛﻨﲔ ﻣﻦ اﻻﺟﺮاءات اﻟﺘﻲ ﻳﺴﺘﺨﺪﻣﻬﺎ .IB اﻻب .NSObject class
][3
#import <Foundation/Foundation. ﻟﻘﺪ رأﻳﻨﺎ ﺳﺎﺑﻘ َﺎ ﻣﻔﺮدة /* MAFoo */
ﺑﺪﻻ ﻣﻦ اﻟﺴﻄﺮ] . [3.3ﻓﺎﳌﻔﺮدة اﻻوﻟﻰ ﺗﺴﺘﺨﺪم ﻣﺎ ﻳﻠﺰم ﻣﻦ >َ h
>#import <Cocoa/Cocoa.h ]// [3.3
دوال ووﻇﺎﺋﻒ ﻟﻠﺒﺮاﻣﺞ اﻟﺘﻲ ﻻ ﺗﻌﺘﻤﺪ إﺳﺘﺨﺪام إﻣﻜﺎﻧﻴﺎت ووﻇﺎﺋﻒ
واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ او ،GUIﺑﻴﻨﻤﺎ ﻣﺎ ﺗﺮاﻩ اﻻن ﺑﺎﻟﺸﻔﺮة @interface MAFoo : NSObject
{
اﻟﺒﺮﻣﺠﻴﺔ ﻳﺴﺘﻨﻔﺬﻫﺎ اﺳﺘﻨﻔﺎذاَ . ]IBOutlet id textField; // [3.7
}
دﻋﻨﺎ اﻻن ﻧﺘﻔﺤﺺ اﳌﻠﻒ اﳌ ُﻨﺸﺎء اﻟﺜﺎﻧﻲ .اﻧﻪ اﳌﻠﻒ اﳌﺴﻤﻰ MAFoo. ;- (IBAction)reset:(id)sender
. mوﻣﺮة اﺧﺮى ﺣﺼﻠﻨﺎ ﻋﻠﻰ ﺳﻄﻮر وﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ﻣﺠﺎﻧ َﺎ دون اي ;- (IBAction)setTo5:(id)sender
@end
ﺗﺪﺧﻞ أو ﻋﻨﺎء ﻣﻦ ﻗﺒﻠﻨﺎ.
][4 ﺳﺘﺮى اﻳﻀ َﺎ ] [3.7وﺟﻮد ﻣﻨﻔﺬ ﺧﺮج outletﻳﺴﺘﺨﺪم ﺣﻘﻞ اﻟﻨﺺ
”#import “MAFoo.h ﻛﻤﻌﺎﻣﻞ -اﳉﺪﻳﺪ ﻫﻨﺎ ﻫﻮ” “idوﻫﻲ ﺗﻌﻨﻲ ﻛﺎﺋﻦ ،أو ﻓﻲ اﳊﻘﻴﻘﺔ
@implementation MAFoo ﻫﻲ ﻣﺆﺷﺮ ﻟﻠﻜﺎﺋﻦ ﺣﻴﺚ ﺗﻨﻮب ﻋﻨﻪ ﻫﻨﺎ .-
]- (IBAction)reset:(id)sender // [4.5 ،ذﻟﻚ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺬي Interface Builderان ” “IBﺗﺸﻴﺮ اﻟﻰ
{ اﺳﺘﺨﺪﻣﻨﺎﻩ ﻹﻧﺸﺎء ﻫﺬﻩ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ.
}
ﺳﺘﺠﺪ اﻳﻀ َﺎ ﻛﻠﻤﺎت IBActionﻓﻲ ] [3.9, 3.10وﻫﻲ ﳑﺎﺛﻠﺔ
// ...Continued
ﻟﻠﺪاﻻت اﻟﺘﻲ ﻻﺗﻘﻮم ﺑﺈرﺟﻊ اي ﻗﻴﻤﺔ .voidودورﻫﺎ ﻫﻨﺎ ﻳﺘﻤﺜﻞ
٦٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ
][5
”#import “MAFoo.h - (IBAction)setTo5:(id)sender
{
@implementation MAFoo }
@end
- (IBAction)reset:(id)sender
{ ﻗﺒﻞ اى ﺷﻲء ،ﺳﻮف ﻳﺘﻢ ﺟﻠﺐ ﺗﺼﺮﻳﺤﺎت ﺗﺮوﻳﺴﺔ اﳌﻠﻒ MAFoo.
}
][textField setIntValue:0]; // [5.7 اﳌﺠﻤﻊ ﻓﺮﺻﺘﺔ ﻓﻲ اﻟﺘﻌﺮف ﻋﻤﺎ ﺳﻴﻮاﺟﻬﻪ.
hو ذﻟﻚ ﺣﺘﻰ ﻳﺄﺧﺬ ّ
ﻳﻮﺟﺪ ﻣﻔﺮدﺗﺎن ﻣﺄﻟﻮﻓﺘﺎن ﻟﻨﺎ ﻫﻨﺎ اﻧﻬﺎ reset:و . setTo5:ﻫﺬﻩ اﻻواﻣﺮ
- (IBAction)setTo5:(id)sender ﻫﻲ ﻧﻔﺴﻬﺎ اﻻﺟﺮاءات methodsاﻟﺘﻲ ﺣﺪدﻧﺎﻫﺎ ﻟﻠﺘﺼﻨﻴﻒ.
{
][textField setIntValue:5]; // [5.12 اﻧﻬﺎ ﺷﺪﻳﺪة اﻟﺸﺒﻪ ﺑﺎﻟﺪاﻻت ذﻟﻚ اﻧﻬﺎ ﺗﺘﻄﻠﺐ وﺿﻊ اﻻواﻣﺮ ﻣﺤﺼﻮرة
} ﺑﲔ اﻻﻗﻮاس اﳌﻌﻘﻮﻓﺔ .ﻓﻔﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ ﻣﺘﻰ ﻣﺎ ﰎ ﺿﻐﻂ اﺣﺪ اﻻزرار،
ﺳﻴﻘﻮم اﻻزرار اﳌﻀﻐﻮط ﺑﺎرﺳﺎل رﺳﺎﻟﺔ اﻟﻰ اﻟﻜﺎﺋﻦ ،MAFooﺗﻄﻠﺐ
@end ﻣﻦ ﺗﻨﻔﻴﺪ اﺣﺪ ﺗﻠﻚ اﻻﻓﻌﺎل .methodsاﳉﻤﻴﻞ ﻓﻲ اﳌﻮﺿﻮع اﻧﻨﺎ
ﻛﻤﺎ ﺗﺮى ﻧﺤﻦ ﻧﺮﺳﻞ اﻟﺮﺳﺎﻟﺔ اﻟﻰ ذﻟﻚ اﻟﻜﺎﺋﻦ اﳌﺨﺰن ﲟﻨﻔﺬ اﳋﺮج ﻏﻴﺮ ﻣﻠﺰﻣﲔ ﺑﻜﺘﺎﺑﺔ اي ﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ﻟﺘﺤﻘﻴﻖ ذﻟﻚ.
outletاﳋﺎص ﺑﺤﻘﻞ اﻟﻨﺺ .textFieldوﲟﺎ اﻧﻨﺎ ﻗﺪ ﻗﻤﻨﺎ ﺑﺎﻋﺪاد ان ﻣﺎ ﻗﻤﻨﺎ ﺑﻪ ﻣﻦ اﻋﻤﺎل ﺗﻮﺻﻴﻞ ﺑﲔ اﻻزرار واﻟﻜﺎﺋﻦ MAFooﻣﻦ
اﻟﺘﻮﺻﻴﻞ ﻣﺎﺑﲔ ﻣﻨﻔﺬ اﳋﺮج وﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ ﺑﺎﺳﺘﺨﺪام ﺑﺮﻧﺎﻣﺞ ﺧﻼل IBﻛﺎن ﻫﻮ ﻛﻞ اﳌﻄﻠﻮب ،وﻗﺪ ﺟﻨﺒﻨﺎ ذﻟﻚ ﻛﺘﺎﺑﺔ ﻫﺬﻩ اﻟﺴﻄﻮر
،IBﻟﺬا ﺳﻴﺘﻢ ﺗﻮﺟﻴﻪ اﻟﺮﺳﺎﻟﺔ اﻟﻰ وﺟﻬﺘﻬﺎ اﻟﺼﺤﻴﺤﺔ. اﻟﺘﻲ ﺗﺮاﻫﺎ اﻻن .ﻋﻠﻰ ﻛﻞ ﺣﺎل ﻋﻠﻴﻨﺎ ﻛﺘﺎﺑﺔ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ
ان اﺳﻢ اﻻﺟﺮاء methodاﳌﺴﺘﺨﺪم ﻟﻌﻤﻠﻴﺔ ارﺳﺎل اﻟﺮﺳﺎﻟﺔ ﻫﻮ ﺳﺘﺠﻌﻞ اﻟﻜﺎﺋﻦ MAFooﻳﺮﺳﻞ رﺳﺎﻟﺘﻪ إﻟﻰ ﺣﻘﻞ اﻟﻨﺺ ﻟﻴﻘﻮم اﻻﺧﻴﺮ
setIntValue:وﻫﻮ ﻳﺘﻄﻠﺐ ﻣﻌﺎﻣﻞ ﻋﺪدي ﺻﺤﻴﺢ .Integerﻛﻤﺎ ﻳﺘﻐﻴﻴﺮ اﻟﻘﻴﻤﺔ اﳌﻌﺮوﺿﺔ ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﺑﺎﻻﺳﻄﺮ ].[5.7, 5.12
٦٧
اﻟﺒﺮﻣﺠﺔ ﺑﺈﺳﺘﺨﺪام واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٦٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ
٦٩
ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﺛﻨﺎء ادﺧﺎﻻك ﻟﻠﻤﻔﺮدة ،ﺳﺘﺠﺪ ان ﻗﺎﺋﻤﺔ ﻧﺘﻴﺠﺔ اﻟﺒﺤﺚ اﻟﺘﻲ ﲢﻮي اﻻﺳﺘﺪﻻل ﻋﻠﻰ اﻻﻳﻌﺎزات اﻻﺳﺘﻘﺼﺎء ﻋﻦ واﻻواﻣﺮ
اﺣﺘﻤﺎل وﺟﻮد ﺗﻠﻚ اﳌﻔﺮدة ﻗﺪ ﺑﺪأت ﺑﺎﻟﺘﻘﻠﺺ ،ﻋﻨﺪﻫﺎ ﺳﺘﺠﺪ ،ﺑﻨﺪ ﻗﺎﺋﻤﺔ menu ﺗﻮﺟﻪ اﻟﻰ Xcodeوﺳﺘﺠﺪ ﺑﺎﻟﻘﺎﺋﻤﺔ اﻟﻌﻠﻴﺎ
ﺗﻠﻚ اﳌﻔﺮدة NSTextFieldﻗﺪ ﻇﻬﺮت اﻋﻠﻰ اﻟﻘﺎﺋﻤﺔ .واﺿﻐﻂ ﻋﻠﻰ اﳌﺴﺎﻋﺪة ﺑﺎﺳﻢ ، Help->Documentation
اﻟﺴﻄﺮ اﻟﺬي ﻳﺸﻬﺮ ﻣﻔﺮدة اﻟﺒﺤﺚ ) NSTextFieldوﻫﻲ ﻫﻨﺎ ﻣﻦ
اﺧﺘﺮ Cocoaﻣﻦ اﻻﻃﺎر اﻻﻳﺴﺮ ﺛﻢ ادﺧﻞ ﻣﻔﺮدة NSTextFieldﺑﺤﻘﻞ
ﻧﻮع ﺗﺼﻨﻴﻒ (Classﺣﺘﻰ ﲢﺼﻞ ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ذﻟﻚ اﻟﺘﺼﻨﻴﻒ.
اﻟﺒﺤﺚ ،ﺗﺄﻛﺪ ﻣﻦ اﺗﺎﺣﺔ ﺧﻴﺎر اﻟﺒﺤﺚ ان ﻳﺸﻤﻞ اﺟﺮاءات واﺟﻬﺔ
وﺳﻮف ﻳﻌﺮض اﻟﺘﺼﻨﻴﻒ ﻣﻌﻠﻮﻣﺎﺗﻪ ﺑﺎﻻﻃﺎر اﻟﺴﻔﻠﻲ.
اﻟﺘﻄﺒﻴﻘﺎت ) ،API-Searchاﻧﻈﺮ ﻟﻠﺼﻮرة اﳌﺮﻓﻘﺔ ﺑﺎﻻﺳﻔﻞ(.
اول اﻣﺮ ﻧﻼﺣﻈﺔ ﻫﻨﺎ ﻫﻮ ان ﻫﺬا اﻟﺘﺼﻨﻴﻒ ﻣﻜﻮن ﺑﺎﻟﻮراﺛﺔ ﻣﻦ
ﺳﻠﺴﻠﺔ ﻣﺘﺼﻠﺔ ﻣﻦ اﻟﺘﺼﻨﻴﻔﺎت اﻻﺧﺮى .اﺧﺮ ﺗﺼﻨﻴﻒ ﻓﻲ اﻟﻘﺎﺋﻤﺔ
ﻫﻮ اﻻب ،أو اﻟﺘﺼﻨﻴﻒ اﳉﺬر ،اﻧﻪ ﻣﻠﻚ اﻟﻬﺮم ! NSObject
اﻧﺰل ﻟﻼﺳﻔﻞ ﻗﻠﻴ َ
ﻼ ) (scrollوﺳﺘﺠﺪ ان اﻟﻌﻨﻮان اﻟﺮﺋﻴﺲ اﻟﺘﺎﻟﻲ:
Method Types
٧٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ
٧١
ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﺑﺎﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻘﻴﻤﺔ ،واﻻﺧﺮ ﻳﺨﺘﺺ ﺑﺎﺳﻨﺎد ﺗﻠﻚ اﻟﻘﻴﻤﺔ .وﻟﻘﺪ ان ﻣﻔﺮدة voidاﻟﺒﺎدﺋﺔ ﺑﻬﺬا اﻻﺟﺮاء ﺗﻌﻨﻲ ﻋﺪم وﺟﻮد ﻗﻴﻤﺔ ﻣﺮﲡﻌﺔ.
ﺗﻌﺎرﻓﻨﺎ ﻋﻠﻰ اﻻﺧﻴﺮ اﻟﺬي ﻳﻘﻮم ﺑﺎﻻﺳﻨﺎد setIntValue:ﻋﻠﻰ ﻛﻞ ﲟﻌﻨﻰ ان اﻻﺟﺮاء setIntValue:ﺑﺎﻟﺮﺳﺎﻟﺔ اﳌﺮﺳﻠﺔ اﻟﻰ ﺣﻘﻞ اﻟﻨﺺ،
ﺣﺎل ﺗﻮأﻣﻪ اﳌﺘﻼزم ﺳﻴﻜﻮن ﻣﺜﻞ ﻣﺎ ﻳﻠﻲ: ﻣﻦ ﻗﺒﻞ اﳌﺮﺳﻞ ﻟﻦ ﲡﻌﻞ ﻫﺬا اﳌﺮﺳﻞ ) MAFoodﻫﻞ ﺗﺘﺬﻛﺮﻩ؟(
][1 ﻳﺴﺘﻘﺒﻞ اي ﻗﻴﻤﺔ راﺟﻌﺔ ﻣﻦ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ ﺟﺮاء ﺗﻨﻔﻴﺬ ﻫﺬا
- (int) intValue
اﻻﺟﺮاء .ﻫﺬا ﻫﻮ اﻟﻄﺒﻴﻌﻲ .ﻓﺒﻌﺪ اﻟﻨﻘﻄﲔ اﻟﻌﻤﻮدﻳﺘﲔ ” “:ﻧﻼﺣﻆ
ﻛﻤﺎ ﺗﺮى ،ﻫﺬا اﻻﺟﺮاء ،ﻳﻘﻮم ﺑﺎرﺟﺎع ﻗﻴﻤﺔ ﻋﺪدﻳﺔ ﺻﺤﻴﺤﺔ .ﻟﺬا ان ﻣﻌﺎﻣﻞ اﻻﺟﺮاء ) (intﻳﺸﺘﺮط ان ﻳﻜﻮن اﳌﺘﻐﻴﺮ اﳌﺮﺳﻞ ﻋﺪد
ﻣﺘﻰ ﻣﺎ اردﻧﺎ اﻻﺳﺘﻌﻼم ﻋﻦ ﻗﻴﻤﺔ ﺗﻠﻚ اﻟﻘﻴﻤﺔ اﻟﻌﺪﻳﺪة اﻟﺼﺤﻴﺤﺔ ﺻﺤﻴﺢ .ﻓﻔﻲ ﻣﺜﺎﻟﻨﺎ اﳌﺴﺘﺨﺪم ،ﻗﻤﻨﺎ ﺑﺎﺳﻨﺎد ﻗﻴﻤﺔ ﻋﺪدﻳﺔ ﺗﺴﺎوي
اﳌﻀﻤﻨﺔ داﺧﻞ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ ﻓﺎﻧﻨﺎ ﺳﻨﻘﻮم ﺑﺎﺳﺘﺪﻋﺎء وﺗﻨﻔﻴﺬّ ٥أو ﻗﻴﻤﺔ ﺗﺴﺎوي ﺻﻔﺮ ،وﻛﻼﻫﻤﺎ ﻋﺪد ﺻﺤﻴﺢ ،ﻟﺬا ﻧﺤﻦ ﻧﺴﻴﺮ
ﻫﺬا اﻻﺟﺮاء ﻛﻤﺎ ﻳﻠﻲ: ﺑﺸﻜﻞ ﺳﻠﻴﻢ.
][2
;]resultReceived = [textField intValue
ﻓﻲ ﺑﻌﺾ اﻻﺣﻴﺎن ﻳﺼﻌﺐ ﻋﻠﻴﻚ ﲢﺪﻳﺪ اﻻﺟﺮاء اﻻﻧﺴﺐ
ﻟﻼﺳﺘﺨﺪام .ﻟﺬا ﻗﻢ ﺑﺎﺳﺘﺸﺎرة وﻣﺮاﺟﻌﺔ ﻣﻜﺘﺒﺔ وﺛﺎﺋﻖ اﳌﺴﺎﻋﺪة،
functions ﻣﺮة أﺧﺮى ،ﻛﻤﺎ ﻫﻮ اﳊﺎل ﻣﻊ وﻇﺎﺋﻒ اﻟﺪوال
وﲤﺮن وﻣﺎرس ﻣﺎ ﺗﺘﻌﻠﻤﻪ.
)واﻻﺟﺮاءات ﻛﺬﻟﻚ( ﺳﺘﻜﻮن ﺟﻤﻴﻊ اﳌﺘﻐﻴﺮات اﻟﺪاﺧﻠﻴﺔ ﺑﺘﻠﻚ
دواﻟﻬﺎ .ﻫﺬﻩ ﻣﻴﺰة ﺟﻤﻴﻠﺔ ﺟﺪاَ ﻻﻧﻬﺎ
اﻟﺪوال ﻣﺤﺠﻮﺑﺔ ﺿﻤﻦ ﻧﻄﺎق ّ ﻣﺎﻟﻌﻤﻞ ﻋﻨﺪﻣﺎ ﺗﺮﻏﺐ ﺑﺎﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﻳﺤﺘﻮﻳﻬﺎ
ﲢﻤﻲ اﺳﻤﺎء اﳌﺘﻐﻴﺮات ،وﻟﻦ ﻳﻌﺘﺮﻳﻚ اﳋﻮف ﻣﻦ اﺳﻨﺎد ﻗﻴﻤﺔ ﳌﺘﻐﻴﺮ ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ؟
ﻓﻲ اﺣﺪ اﺟﺰاء ﺑﺮﻧﺎﻣﺠﻚ ﺧﻮﻓ َﺎ ﻣﻦ ﻳﺆدي ذﻟﻚ اﻻﺳﻨﺎد ﻟﺘﻐﻴﻴﺮ ﻗﻴﻤﺔ ﻫﻞ ﺗﺘﺬﻛﺮ ذﻟﻚ اﳌﺒﺪء اﳉﻤﻴﻞ اﻟﺬي ﻳﺤﺠﺐ ﻋﻨﻚ اﳌﺘﻐﻴﺮات اﳋﺎﺻﺔ
ﻣﺘﻐﻴﺮ آﺧﺮ ﻳﺼﺪف ان ﻳﻜﻮن ﺑﻨﻔﺲ اﻻﺳﻢ. ﺑﻨﻄﺎق اﻟﺪاﻟﺔ؟ ﻫﺬا اﳌﺒﺪء ﻳﻨﻄﺒﻖ ﻫﻨﺎ ﻓﻲ ﺣﺎﻟﺔ اﻻﺟﺮاءات .ﻋﻠﻰ ﻛﻞ
ﺗﺪﻓﻊ Objective-Cﻣﻴﺰة اﳊﺠﺐ ﻫﺬﻩ ﺷﻮﻃ َﺎ اﺑﻌﺪ ،ﺣﻴﺚ ﺗﺸﺘﺮط ان ﺣﺎل ﻏﺎﻟﺒ َﺎ ﻣﺎ ﺳﺘﺠﺪ ان اﻻﺟﺮاءات ﺗﺄﺗﻲ ﺑﺸﻜﻞ ﺗﻮأم ﻣﺘﻼزم ،ﻧﺪﻋﻮ
ان ﺗﻜﻮن اﺳﻤﺎء اﻻﺟﺮاءات ﻓﺮﻳﺪة ﻓﻘﻂ داﺧﻞ ﻧﻄﺎق اﻟﺘﺼﻨﻴﻒ ،ﻟﺬا ﺗﻠﻚ اﻻﺟﺮاءات اﳌﺘﻼزﻣﺔ ﺑـ ” ،“Accessorsﻓﻬﻨﺎك إﺟﺮاء ﺧﺎص
٧٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ
اﻟﺮﺳﻮﻣﻴﺔ GUI،ﻓﻔﻲ ﺣﺎل اردﻧﺎ اﺳﺘﺒﺪال ﻛﺎﺋﻦ ﺣﻘﻞ اﻟﻨﺺ، ﺳﺘﺠﺪ ﻋﺪة ﺗﺼﻨﻴﻔﺎت ﻣﺨﺘﻠﻔﺔ ﻟﺪﻳﻬﺎ اﺟﺮاءات ﺑﺎﺳﻤﺎء ﻣﻮﺣﺪة.
ﺑﻜﺎﺋﻦ آﺧﺮ ﻣﻦ ﻓﺼﻴﻠﺔ ﻣﺨﺘﻠﻔﺔ وﻟﻜﻦ اﻻﺧﻴﺮ ﻳﻘﺒﻞ ﺗﻨﻔﻴﺬ اﻹﺟﺮاء ﻫﺬﻩ ﻣﻴﺰة ﻣﻬﻤﺔ ﺗﻠﻤﺲ ﻗﻴﻤﺘﻬﺎ ﻣﺘﻰ ﻋﻤﻠﺖ ﻋﻠﻰ ﺗﻄﻮﻳﺮ ﺑﺮاﻣﺞ
، setInValue:ﻋﻨﺪﻫﺎ ﺳﻴﻈﻞ ﺑﺮﻧﺎﻣﺠﻨﺎ ﻳﻌﻤﻞ دون اﳊﺎﺟﺔ ﻟﺘﻐﻴﻴﺮ ﺿﺨﻤﺔ ،ﺣﻴﺚ ﻳﺘﺸﺎرك ﻓﻲ ﻛﺘﺎﺑﺘﻬﺎ ﻋﺪة ﻣﺒﺮﻣﺠﲔ ،وﻛﻞ واﺣﺪ
اي ﺷﻔﺮة ﺑﺮﻣﺠﻴﺔ ،أو ﺣﺘﻰ اﳊﺎﺟﺔ ﻻﻋﺎدة ﺗﺮﻛﻴﺐ اﻟﺒﺮﻧﺎﻣﺞ ﻣﻦ ﻣﻨﻬﻢ ﻣﺴﺌﻮل ﻋﻦ ﺗﺼﻤﻴﻢ اﻟﺘﺼﻨﻴﻒ اﻟﺬي ﻳﺮاﻩ ﻣﻨﺎﺳﺒ َﺎ ،دون وﺟﻮد
اﳌﺠﻤﻊ.
ﺧﻼل ّ ﻣﺸﺎﻛﻞ ﺗﺘﻌﻠﻖ ﺑﺘﺼﺎدم أو إزدواﺟﻴﺔ ﺑﺎﺳﻤﺎء اﻻﺟﺮاءات.
ﻧﺤﻦ ﻗﺎدرون ﺣﺘﻰ ﻋﻠﻰ ﺗﻐﻴﻴﺮ ﻧﻮع اﻟﻜﺎﺋﻦ وﻗﺖ اﻟﺘﺸﻐﻴﻞ دون ان وﻫﻨﺎك اﳌﺰﻳﺪ ﻣﻦ اﻟﻔﺎﺋﺪة .ﺣﻴﺚ ان ﺣﻘﻴﻘﺔ وﺟﻮد ﻋﺪة إﺟﺮاءات
ﻳﻜﻮن ﻟﺬﻟﻚ ﺿﺮر ﻋﻠﻰ اي ﻗﻄﺎع ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ ﻋﻠﻰ اﻻﻃﻼق. ﻣﺘﻤﺎﺛﻠﺔ اﻻﺳﻤﺎء داﺧﻞ ﻋﺪة ﺗﺼﻨﻴﻔﺎت ﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ ﺗﻘﻨﻴ َﺎ
ﻫﻨﺎ ﺗﻜﻤﻦ اﻟﻘﻮة واﻟﻔﺎﺋﺪة ﻋﻨﺪ اﺳﺘﺨﺪام اﻟﺒﺮﻣﺠﺔ ﺑﺎﻟﻜﺎﺋﻨﺎت )(OOP . polymorphismوﻫﺬﻩ اﻻﺧﻴﺮة ﻫﻲ ﻣﺎ ﻳﺠﻌﻞ اﻟﺒﺮﻣﺠﺔ ﺑﺎﻟﻜﺎﺋﻨﺎت
. object-oriented programmingواﺧﺘﺼﺎرﻫﺎ ) (OOPاﺳﻠﻮﺑ َﺎ
ﺑﺮﻣﺠﻴ َﺎ ﻓﺮﻳﺪاَ.
ﻓﻬﺬﻩ اﳌﻴﺰة ﲤﻜﻨﻚ ﻣﻦ ﻛﺘﺎﺑﺔ ﻛﺘﻞ ﻣﻦ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ دون ان
ﻳﺘﻄﻠﺐ ﻣﻨﻚ ذﻟﻚ ﻣﻌﺮﻓﺔ ﻣﺴﺒﻘﺔ ﻋﻦ ﻛﺎﺋﻦ اﻟﺘﺼﻨﻴﻒ أو اﻟﺘﺼﻨﻴﻔﺎت
classesاﻟﺘﻲ ﺗﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ.
ذﻟﻚ ﻛﻞ ﻣﺎ ﻫﻮ ﻣﻄﻠﻮب ،ﻓﻌﻨﺪ ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻓﻌﻠﻴ َﺎ run-time
ﺳﺘﻘﻮم ﺗﻠﻚ اﻟﻜﺎﺋﻨﺎت ﺑﺘﻔﻬﻢ واﺳﺘﻴﻌﺎب اﻟﺮﺳﺎﺋﻞ اﳌﻮﺟﻬﺔ اﻟﻴﻬﺎ.
ان اﻻﺳﺘﻔﺎدة ﻣﻦ ﻫﺬﻩ اﳌﻴﺰة ،ﲤﻜﻨﻚ ﻣﻦ ﻛﺘﺎﺑﺔ ﺗﻄﺒﻴﻘﺎت ﻗﺎﺑﻠﺔ
ﻟﻠﺘﻌﺪﻳﻞ واﻟﺘﻄﻮﻳﺮ.
ﻛﻤﺜﺎل ،ﻧﻮرد ﺑﺮﻧﺎﻣﺠﻨﺎ اﻟﺬي اﺳﺘﺨﺪﻣﻨﺎ ﻓﻴﻪ واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت
٧٣
ﺑﺤﺚ اﻟﺘﻌﻠﻴﻤﺎت اﻟﺒﺮﻣﺠﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٧٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻻﺳﺘﻨﻬﺎض ﻣﻦ اﻟﻐﻔﻮة
اﻻﺳﺘﻨﻬﺎض ﻣﻦ اﻟﻐﻔﻮة
ﻗﺎﻣﺖ أﭘﻞ ﺑﻌﻤﻞ اﻟﻜﺜﻴﺮ واﻟﻜﺜﻴﺮ ﻟﺘﺴﻬﻞ ﻋﻠﻴﻚ إﻧﺸﺎء ﺑﺮاﻣﺠﻚ.
ﻓﻔﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ اﻟﺼﻐﻴﺮ ،ﻟﻢ ﻧﻜﺘﺮث ﻟﺒﺮﻣﺠﺔ اﻟﻨﺎﻓﺬة ﻛﻲ ﺗﺮﺳﻢ ذاﺗﻬﺎ
ﻋﻠﻰ اﻟﺸﺎﺷﺔ ،وﻟﻢ ﻳﻜﻦ ﻣﻄﻠﻮﺑ َﺎ ﻣﻨﺎ ﻛﺘﺎﺑﺔ اي ﺳﻄﺮ ﺑﺮﻣﺠﻲ ﻟﻨﺸﺮح
ﻟﻺزرار ﻛﻴﻒ ﻳﺮﺳﻢ ذاﺗﻪ ﻋﻠﻰ اﻟﻨﺎﻓﺬة ،ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ اﻣﻮر وﺗﻔﺎﺻﻴﻞ
اﺧﺮى .ﻓﻬﺬﻩ اﻻﻋﻤﺎل ﻣﻦ ﻣﺴﺌﻮﻟﻴﺔ ﻫﻴﻜﻠﻲ ﻋﻤﻞ frameworks
،اﺛﻨﲔ ﻫﻤﺎ Foundation Kit frameworkو Application Kit.
framework
٧٥
اﻻﺳﺘﻨﻬﺎض ﻣﻦ اﻟﻐﻔﻮة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﻹﺳﺘﻨﻬﺎض ﺑﺒﺮوﺗﻮﻛﻞ NSNibAwakening ان ﺟﻤﻴﻊ اﳌﻌﻠﻮﻣﺎت اﻟﺘﻲ ﺗﻬﺘﻢ ﻟﻬﺎ ﻧﺎﻓﺬة اﻟﺒﺮﻧﺎﻣﺞ ﻣﺨﺰﻧﺔ ﲟﻠﻒ
اﻧﻪ إﺟﺮاء ﻟﻺﻋﻼن واﻟﺘﺼﺮﻳﺢ ،ﻳﺤﺘﻮي ﻣﺎ ﻳﻠﻲ: ﻣﻦ اﻣﺘﺪاد ) nibو nibﻫﺬﻩ ﲤﺜﻞ اﻣﺘﺪاد ﻣﺨﺘﺼﺮ ﻟﻜﻠﻤﺔ Next
.( Interface Builder
ان ﻓﻲ ذﻟﻚ اﺷﺎراة اﻟﻰ ان اﻻﺟﺮاء اﻟﺬي ﻧﺤﺘﺎﺟﺔ ﻳﺨﺘﺺ ﺑﻘﻄﺎع
ﻫﻴﻜﻞ اﻟﻌﻤﻞ . Application Kitﻟﺬا دﻋﻨﺎ ﻧﺘﻔﺤﺺ ﻛﻴﻔﻴﺔ ﺣﺼﻮﻟﻨﺎ
ﻋﻠﻰ اﳌﻌﻠﻮﻣﺎت ﺣﻮل ﻫﺬا اﻟﻬﻴﻜﻞ اﻟﻌﻤﻠﻲ .وﻣﻦ ﺧﻼل Xcode،
ﺗﻮﺟﻪ إﻟﻰ ﻗﺎﺋﻤﺔ اﳌﺴﺎﻋﺪة Help menuواﺧﺘﺮ وﺛﺎﺋﻖ اﳌﺴﺎﻋﺪة
.Documentation
ﻓﻲ ﻧﺎﻓﺬة وﺛﺎﺋﻖ اﳌﺴﺎﻋﺪة ﺗﺄﻛﺪ ﻣﻦ ان ﺧﻴﺎر ﺑﺤﺚ ﻛﺎﻓﺔ اﻟﻨﺼﻮص
Full-Text Searchﻗﻴﺪ اﻟﺘ ّﻔﻌﻴﻞ )وﻟﻌﻤﻞ ذﻟﻚ ﻗﻢ ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ
اﻳﻘﻮﻧﺔ اﳌﻜﺒﺮ ﺑﺤﻘﻞ اﻟﺒﺤﺚ اﳌﻮﺟﻮد ﺑﺘﻠﻚ اﻟﻘﺎﺋﻤﺔ( .ﺛﻢ ﻗﻢ ﺑﻜﺘﺎﺑﺔ
Application Kitﺑﺤﻘﻞ اﻟﺒﺤﺚ ﻳﻠﻴﻬﺎ ﻣﻔﺘﺎح اﻻدﺧﺎل .Return
اﻟﺒﺮوﺗﻮﻛﻮل ﻋﺒﺎرة ﻋﻦ ﻃﺮﻳﻘﺔ ذات آﻟﻴﺔ ﻋﻤﻞ ﻣﺘﻔﻖ ﻋﻠﻴﻬﺎ ،ﻓﻬﻮ
ﺳﻴﻘﻮم Xcodeﺑﺘﺰوﻳﺪك ﺑﻌﺪة ﻧﺘﺎﺋﺞ ﻣﺘﻨﻮﻋﺔ .وﻣﻦ ﺿﻤﻦ ﻫﺬﻩ
ﻫﻨﺎ ﺑﺮوﺗﻮﻛﻮل اﻋﻼﻣﻲ ،informalﻳﺘﻜﻮن ﻣﻦ إﺟﺮاء واﺣﺪ ،ﻳﺘﻤﺜﻞ
اﻟﻨﺘﺎﺋﺞ ﺳﺘﺠﺪ وﺛﻴﻘﺔ ﺑﺎﺳﻢ Application Kit Reference for
ﺑـ .awakeFromNib
.Objective-Cداﺧﻞ اﻟﻮﺛﻴﻘﺔ ﺳﺘﺠﺪ ﻗﺎﺋﻤﺔ ﻣﻦ اﳋﺪﻣﺎت اﻟﺘﻲ
ﺗﻘﻮم اﻟﺘﺼﻨﻴﻔﺎت ﺑﺈﻗﺤﺎم -implement-ﻫﺬا اﻟﺒﺮوﺗﻮﻛﻞ ﻟﻴﺴﺎﻋﺪﻫﺎ ﻳﻮﻓﺮﻫﺎ ﻫﺬا اﻟﻬﻴﻜﻞ.
ﺑﺘﻬﺌﻴﺔ ﺣﺎﻟﺘﻬﺎ اﻟﻨﻬﺎﺋﻴﺔ ﻣﺘﻰ ﻣﺎ ﰎ ﺟﻠﺒﻬﺎ ﻣﻦ ارﺷﻴﻒ اﳌﻠﻒ اﻟﺬي
راﺑﻂ ﻳﺴﻤﻰ Protocols ﺳﺘﺠﺪ ﲢﺖ اﻟﻌﻨﻮان اﻟﻔﺮﻋﻲ ﻟﻠﻘﺴﻢ
ﻳﺨﺮﻧﻬﺎ واﻟﺬي ﻳﻜﻮن اﻣﺘﺪادﻩ .NIBﻓﻤﺘﻰ ﻣﺎ اﻗﺤﻤﻨﺎ -implement- NSNibAwakening.
ﻫﺬا اﻻﺟﺮاء ،ﻓﺎﻧﻪ ﺳﻴﻜﻮن ﻗﻴﺪ اﻟﺘﻨﻔﻴﺬ ﻻﺟﺮاء اﻟﺘﻬﺌﻴﺔ اﳌﻨﺎﺳﺒﺔ ﻟﻠﻜﺎﺋﻦ
٧٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﻻﺳﺘﻨﻬﺎض ﻣﻦ اﻟﻐﻔﻮة
][1
”#import “MAFoo.h
اﻟﺬي ﻗﺎم ﺑﺎﺳﺘﺪﻋﺎﺋﺔ وﻫﻮ ﻓﻲ ﻣﺮﺣﻠﺔ اﻟﺘﺤﻤﻴﻞ ﻣﻦ اﻻرﺷﻴﻒ .ﺑﻨﺎء ﻋﻠﻰ
ذﻟﻚ ﳝﻜﻨﻨﺎ اﺳﺘﺨﺪاﻣﺔ ﻟﺘﺤﻘﻴﻖ ﻫﺪﻓﻨﺎ :اي ﻋﺮض ﻗﻴﻤﺔ اﻓﺘﺮاﺿﻴﺔ
@implementation MAFoo
ﻣﻌﻴﻨﺔ وﻗﺖ اﻟﺘﺸﻐﻴﻞ.
ﻧﻘﺘﺮح ﻋﻠﻴﻚ دوﻣ َﺎ ان ﲡﺮي ﺑﺤﺜﻚ وﲢﻮﻳﺎﺗﻚ ﻋﻦ اﻻﺟﺮاءات
- (IBAction)reset:(id)sender
{
;][textField setIntValue:0 ﻼ ﻣﻦ اﻟﺘﺼﻔﺢ اﻻﻧﺴﺐ .و ﻏﺎﻟﺒ َﺎ ﻣﺎ ﻳﺘﻄﻠﺐ ذﻟﻚ ﻗﻠﻴ َ
}
واﻻﺳﺘﺨﺪام اﳋﻼق ﳌﻔﺮدات اﻟﺒﺤﺚ اﳌﺴﺘﺨﺪﻣﺔ ﻟﺘﺴﻠﻴﻂ
- (IBAction)setTo5:(id)sender اﻟﻀﻮء ﻋﻠﻰ اﻻﺟﺮاء اﳌﻄﻠﻮب.
{
;][textField setIntValue:5 ﻟﺬا ﻣﻦ اﳌﻬﻢ ﺟﺪاَ ان ﺗﺘﺄﻟﻒ ﺑﺒﺤﺜﻚ ﺧﻼل ﺗﻠﻚ اﻟﻮﺛﺎﺋﻖ ﺣﻮل ﻫﺬان
}
اﻟﻬﻴﻜﻼن frameworks،ﺣﺘﻰ ﺗﺘﻤﻜﻦ ﻣﻦ اﻟﺘﻌﺮف ﻋﻠﻰ اﻟﺘﺼﻨﻴﻔﺎت
]- (void)awakeFromNib // [1.15 اﻟﺘﻲ ﻳﻘﺪﻣﺎﻧﻬﺎ ،واﻻﺟﺮاءات اﻟﺘﻲ ﺳﻮف ﺗﻜﻮن ﲢﺖ ﺗﺼﺮﻓﻚ.
{
;][textField setIntValue:0 ﻗﺪ ﺗﻘﺮأ ﻋﻦ ﻣﻌﻠﻮﻣﺎت ﻟﻴﺴﺖ ﺑﺬات اﻫﻤﻴﺔ ﻟﺒﺤﺜﻚ اﳊﺎﻟﻲ ،وﻟﻜﻨﻚ
}
ﺳﺘﻜﺘﺸﻒ اﻧﻚ ﺗﺒﻨﻲ ﻗﺎﻋﺪة ﻣﻦ اﳌﻌﻠﻮﻣﺎت ﲟﺨﻴﻠﺘﻚ ﺳﻮف ﻳﻜﻮن
@end ﻟﻬﺎ اﻻﺛﺮ ﻓﻲ ﺳﺮﻋﺔ ﺑﻨﺎﺋﻚ ﻟﺒﺮاﻣﺠﻚ.
ﻣﺘﻰﻣﺎ ﻗﺎﻣﺖاﻟﻨﺎﻓﺬة ﺑﻌﺮض ذاﺗﻬﺎ،ﺳﻴﻘﻮم اﻻﺟﺮاء awakeFromNib ﺟﻤﻴﻞ ﺟﺪاَ ،ﻟﻘﺪ وﺟﺪﻧﺎ اﻻﺟﺮاء ﺑﻌﺪ ﺗﺴﻠﻴﻂ اﻟﻀﻮء ﻋﻠﻴﻪ ،وﻛﻞ ﻣﺎ
ﺑﺈﺳﺘﺪﻋﺎء ذاﺗﺔ إﻟﻴ َﺎ .وﻛﻨﺘﻴﺠﺔ ﻟﺬﻟﻚ ،ﺳ ُﻴﺴﺘﻨﻬﺾ ﺣﻘﻞ اﻟﻨﺺ ﻋﻠﻴﻨﺎ ﻋﻤﻠﻪ اﻻن ﻫﻮ إﺿﺎﻓﺘﺔ إﻟﻰ ﻣﻠﻒ ﺗﻮﺻﻴﻒ اﻟﺘﺼﻨﻴﻒ MAFoo.
ﻣﺒﻜﺮاَ ﻟﻴﻌﺮض ﻗﻴﻤﺔ ﺗﺴﺎوي ﺻﻔﺮ ﻣﺎ ان ﻳﻜﻮن ﻇﺎﻫﺮاَ ﻟﻚ داﺧﻞ mﻛﻤﺎ ﻳﻠﻲ:
ﺗﻠﻚ اﻟﻨﺎﻓﺬة اﳌﻔﺘﻮﺣﺔ.
٧٧
اﻻﺳﺘﻨﻬﺎض ﻣﻦ اﻟﻐﻔﻮة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٧٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﺆﺷﺮات
اﳌﺆﺷﺮات
ﻣﻦ واﺟﺒﻨﺎ ﲢﺬﻳﺮك ان ﻫﺬا اﻟﻔﺼﻞ ﻳﺤﺘﻮي ﻋﻠﻰ ﻋﺪد ﻣﻦ اﳌﻔﺎﻫﻴﻢ
اﳌﺘﻘﺪﻣﺔ ﺣﻮل اﺳﺎﺳﻴﺎت ﻟﻐﺔ Cواﻟﺘﻲ ﻗﺪ ﺗُﺸﻌﺮ اﳌﺒﺘﺪﺋﲔ ﺑﺎﻟﻀﻴﻖ
واﻟﺘﻀﺠﺮ.
ﻻ ﺗﻘﻠﻖ اذا ﻟﻢ ﺗﺴﺘﻮﻋﺒﻬﺎ اﻻن وﻻ ﲡﻌﻞ اﻻﻣﺮ ﻳﻘﻠﻘﻚ ﺣﻴﺚ اﻧﻪ
ﻟﻴﺲ ﻣﺘﻄﻠﺐ رﺋﻴﺴﻲ ﻟﺒﺪء اﻟﺒﺮﻣﺠﺔ ﺑﻠﻐﺔ ، Objective-Cﻟﻜﻦ
اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﳌﺆﺷﺮات ﻟﻪ ﻓﻮاﺋﺪ ﺟﻤﺔ ،ﻓﻌﻨﺪﻣﺎ ﺗﻘﻮم ﺑﺘﻌﻴﲔ وﺗﻌﺮﻳﻒ
ﻣﺘﻐﻴﺮ ،variableﺳﻴﻘﻮم اﳌﺎﻛﻨﺘﻮش ﺑﺤﺠﺰ ﺣﻴﺰ ﻣﻌﲔ ﻣﻦ اﻟﺬاﻛﺮة
وذﻟﻚ ﳊﻔﻆ اﻟﻘﻴﻢ اﻟﺘﻲ ﺳﻴﺤﺘﻮﻳﻬﺎ ﻫﺬا اﳌﺘﻐﻴﺮ .ﻛﻤﺜﺎل ﻋﻠﻰ ذﻟﻚ،
ﺗﻔﺤﺺ اﻻﻳﻌﺎز اﻟﺘﺎﻟﻲ:
][1
;int x = 4
٧٩
اﳌﺆﺷﺮات ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
اﻟﻌﺪدﻳﺔ .(٤وﻋﻠﻰ اﻟﻨﻘﻴﺾ ﻣﻦ ذﻟﻚ ﻋﻨﺪﻣﺎ ﻳﺠﺮي ﺗﻘﻴﻴﻢ اﻻﻳﻌﺎز ﲢﺪﻳﺪ اﳌﺴﺎﺣﺔ اﳌﻄﻠﻮﺑﺔ ﻟﻠﺤﺠﺰ واﻻﺣﺘﻔﺎظ ﺑﻘﻴﻤﺔ اﳌﺘﻐﻴﺮ .xﻟﻮ
،&xﻓﺈن اﳊﺎﺳﺐ ﻫﻨﺎ ﻟﻦ ﻳﻌﻮد ﻟﻨﺎ ﺑﺎﻟﻘﻴﻤﺔ اﶈﻔﻮﻇﺔ ﻟﻠﻤﺘﻐﻴﺮ ،ﺑﻞ ﻛﺎﻧﺖ اﻟﻘﻴﻤﺔ ﻣﻦ ﻧﻮع ﻋﺪدي ﻛﺒﻴﺮ أو ﻋﺪد ﻣﺰدوج (long long or
ﺳﻴﻌﻮد ﺑﺎﻟﻌﻨﻮان اﻟﺬي ﻳﻮﺟﺪ ﺑﻪ ذﻟﻚ اﳌﺘﻐﻴﺮ ﻣﻦ اﻟﺬاﻛﺮة .ان اﻟﻌﻨﻮان ) ،doubleﺳﻴﺘﻄﻠﺐ ذﻟﻚ ﻣﻦ اﳊﺎﺳﺐ ان ﻳﻘﻮم ﺑﺤﺠﺰ ﺣﻴﺰ اﻛﺒﺮ ﻣﻦ
ﻋﺒﺎرة ﻋﻦ رﻗﻢ ﳝﺜﻞ ﺟﺰء ﻣﻌﲔ ﻣﻦ ذاﻛﺮة اﳊﺎﺳﺐ )ﻣﺜﻞ اﻻرﻗﺎم اﻟﺬاﻛﺮة اﳌﺘﺎﺣﺔ.
اﻟﺘﻲ ﲤﺜﻞ ﻏﺮف اﻟﻔﻨﺪق -وﻓﻨﺪﻗﻨﺎ ﻫﻨﺎ ﻣﻜﻮن ﻣﻦ آﻻف اﻵﻻف ﻣﻦ إن اﻳﻌﺎز اﻻﺳﻨﺎد ” “x = 4ﺳﻴﻘﻮم ﺑﺘﺨﺰﻳﻦ ﻗﻴﻤﺔ اﻟﻌﺪد ٤ﻓﻲ ذﻟﻚ
اﻟﻐﺮف( ﺳﻴﺘﻢ اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﳌﺆﺷﺮ ﻛﻤﺎ ﻳﻠﻲ: اﳊﻴﺰ اﶈﺠﻮز ﻣﻦ اﻟﺬاﻛﺮة .ﺑﺎﻟﺘﺄﻛﻴﺪ ﺳﻴﺘﺬﻛﺮ اﳊﺎﺳﺐ اﻳﻦ ﻗﺎم
][2
;int *y
ﺑﺘﺨﺰﻳﻦ ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ xﻣﻦ اﻟﺬاﻛﺮة ،أو ﲟﻌﻨﻰ آﺧﺮ إﻧﻪ ﻳﻌﺮف ”ﻋﻨﻮان“
اﳌﺘﻐﻴﺮ xﻣﻦ اﻟﺬاﻛﺮة ،ﺑﻬﺬﻩ اﻟﻄﺮﻳﻘﺔ ،ﻛﻠﻤﺎ اﺳﺘﺨﺪﻣﺖ اﳌﺘﻐﻴﺮ xﻓﻲ
ﻫﺬا اﻻﻳﻌﺎز ﻳﺼﺮح ﻋﻦ ان ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ yﲢﺘﻮي ﻋﻨﻮان ﻣﻦ اﻟﺬاﻛﺮة ﺑﺮﻧﺎﻣﺠﻚ ،ﺳﻴﻘﻮم اﳊﺎﺳﺐ ﺑﺎﻟﺒﺤﺚ ﻓﻲ اﳌﻜﺎن اﻟﺼﺤﻴﺢ )اﻟﻌﻨﻮان
ﳌﺘﻐﻴﺮ آﺧﺮ ﻣﻦ ﻧﻮع ﻋﺪدي ﺻﺤﻴﺢ .intوﻟﻨﻘﻮم ﺑﺤﻔﻆ ﻋﻨﻮان اﳌﺘﻐﻴﺮx
اﻟﺼﺤﻴﺢ ﺑﺎﻟﺬاﻛﺮة( ﻻﻳﺠﺎد اﻟﻘﻴﻤﺔ اﳌﺨﺰﻧﺔ اﳋﺎﺻﺔ ﺑﺎﳌﺘﻐﻴﺮ.x
داﺧﻞ اﳌﺘﻐﻴﺮ ) yﻧﺴﻨﺪ ﻋﻨﻮان xاﻟﻰ yﺗﻘﻨﻴﻨﺎً( ﻧﻜﺘﺐ ﻣﺎ ﻳﻠﻲ:
][3 ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﻴﺮ ﺗﻜﻮن ﻗﻴﻤﺘﻪ ”ﻋﻨﻮان“ )(pointer اﳌﺆﺷﺮ
;y = &x ﳌﺘﻐﻴﺮ آﺧﺮ.
ﻣﻊ وﺟﻮد اﳌﺆﺷﺮ ،ﳝﻜﻨﻚ اﻟﻮﺻﻮل اﻟﻰ ﻗﻴﻤﺔ ذﻟﻚ اﳌﺘﻐﻴﺮ اﻟﺬي ﻣﺘﻰ ﻣﺎ ﻛﺎن ﻟﺪﻳﻚ ﻣﺘﻐﻴﺮ ،ﳝﻜﻨﻚ ان ﲢﺼﻞ ﻋﻠﻰ ﻋﻨﻮان ﻣﻮﻗﻌﻪ
ﻳﺸﻴﺮ اﻟﻴﻪ ،ﻣﻦ ﺧﻼل اﺿﺎﻓﺔ ﻋﻼﻣﺔ ﻣﻌﺎﻣﻞ اﻟﻀﺮب * ﻛﺒﺎدﺋﺔ اﻣﺎم ﺑﺎﻟﺬاﻛﺮة ﻣﻦ ﺧﻼل اﺿﺎﻓﺔ اﻟﺮﻣﺰ & ﻛﺒﺎدﺋﺔ اﺳﻤﻴﺔ.
اﺳﻢ اﳌﺘﻐﻴﺮ )اﳌﺆﺷﺮ( .ﻛﻤﺜﺎل ،ان ﺗﻘﻴﻴﻢ ﻫﺬا اﻻﻳﻌﺎز
ﻟﺬا ﺣﺘﻰ ﻧﺘﺤﺼﻞ ﻋﻠﻰ ﻋﻨﻮان اﳌﺘﻐﻴﺮ ،xﻳﺠﺐ ﻋﻠﻴﻨﺎ ﻛﺘﺎﺑﺔ .&x
*y
&x
ﺳﻴﻌﻮد ﺑﻘﻴﻤﺔ ﻋﺪدﻳﺔ ﺗﺴﺎوي .٤ﻓﺎﻻﻳﻌﺎز ﻫﺬا ﳝﺎﺛﻞ اﻻﻳﻌﺎز
ﻋﻨﺪﻣﺎ ﻳﻘﻮم اﳊﺎﺳﺐ ﺑﺘﻘﻴﻴﻢ اﻻﻳﻌﺎز ،xﻓﺎﻧﻪ ﺳﻴﻘﻮم ﻓﻮراَ ﺑﺎرﺟﺎع
اﳌﺴﺘﺨﺪم ﻟﺘﻘﻴﻴﻢ ” .“xإن ﺗﻨﻔﻴﺬ اﻻﻳﻌﺎز
ﻗﻴﻤﺔ ذﻟﻚ اﳌﺘﻐﻴﺮ )ﻓﻲ ﻣﺜﺎﻟﻨﺎ اﻟﺴﺎﺑﻖ ﻛﺎﻧﺖ ﻗﻴﻤﺔ اﳌﺘﻐﻴﺮ ﺗﺮﺟﻊ اﻟﻘﻴﻤﺔ
٨٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﺆﺷﺮات
*y = 5
ﺳﻴﻜﻮن ﳑﺎﺛ َ
ﻼ ﻟﺘﻨﻔﻴﺬ اﻻﻳﻌﺎز
x = 5
٨١
اﳌﺆﺷﺮات ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٨٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ
٨٣
ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻟﻘﺪ اﺳﺘﺨﺪﻣﻨﺎ ﻣﺆﺷﺮ ﻟﻴﻘﻮم ﺑﺎﻻﺣﺘﻔﺎظ ﺑﺘﻠﻚ اﻟﺴﻠﺴﻠﺔ ﻣﻦ اﳊﺮوف. اﻟﺘﺼﻨﻴﻒ .NSMutableStringدﻋﻨﺎ ﻧﺘﺤﺪث ﻋﻦ ﻫﺬﻩ اﻟﺘﺼﻨﻴﻔﺎت
ﻳﻌﻮد اﻟﺴﺒﺐ ﻓﻲ ذﻟﻚ ﻟﻄﺒﻴﻌﺔ Objective-Cاﻟﺘﻲ ﲤﻜﻨﻚ ﻣﻦ ﺣﻴﺚ ﺳﻨﺒﺪأ ﺑﺎﻟﺘﺼﻨﻴﻒ . NSString
اﻟﺘﻌﺎﻣﻞ ﻣﻊ وﺗﻐﻴﻴﺮ ﻗﻴﻤﺔ اﻟﻜﺎﺋﻨﺎت ﻣﻦ ﺧﻼل اﳌﺆﺷﺮات وﻟﻴﺲ ﻣﻦ ][2
ﺧﻼل اﻟﺘﻌﺎﻣﻞ اﳌﺒﺎﺷﺮ. ;NSString *favoriteComputer
;”!favoriteComputer = @”Mac
;)NSLog(favoriteComputer
ﺣﺘﻰ اﻻن ﻛﻞ ﺷﻲء ﺟﻤﻴﻞ ،ﻟﻜﻦ ﻣﺎﺑﺎل ذﻟﻚ اﻟﺮﻣﺰ اﻟﻐﺮﻳﺐ
@ اﻟﺬي ﻳﻈﻬﺮ ﺑﲔ ﺳﻄﻮر ﺷﻔﺮﺗﻨﺎ اﻟﺒﺮﻣﺠﻴﺔ ﻣﻦ ﺣﲔ ﻣﻦ اﶈﺘﻤﻞ ﺟﺪاَ ان ﻳﻜﻮن اﻟﺴﻄﺮ اﻟﺜﺎﻧﻲ ﻣﻔﻬﻮﻣ َﺎ ،وﻟﻜﻦ اﻟﺴﻄﺮ
ﻵﺧﺮ؟ اﻻول ] [2.1ﻳﺴﺘﺤﻖ ﺑﻌﺾ اﻟﺘﻮﺿﻴﺢ.
ﻛﻤﺎ ﺗﻌﻠﻢ ﺗﻌﺪ ﻟﻐﺔ Objective-Cاﻣﺘﺪاد ﻣﺘﻄﻮر ﻣﻦ ﻟﻐﺔ Cاﻻﺻﻠﻴﺔ، -pointerﻓﻬﻞ ﺗﺘﺬﻛﺮ ﻋﻨﺪﻣﺎ ﻗﻤﻨﺎ ﺑﺎﻟﺘﺼﺮﻳﺢ ﻋﻦ اﳌﺘﻐﻴﺮ اﳌﺆﺷﺮ
ﻓﺎﻟﻘﺪﳝﺔ ﻟﻬﺎ ﻃﺮﻳﻘﺘﻬﺎ ﻓﻲ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻨﺼﻮص وﺳﻼﺳﻞ اﳊﺮوف ،variable-ﻛﺎن ﻋﻠﻴﻨﺎ ﺣﻴﻨﻬﺎ ﲢﺪﻳﺪ ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﺘﻲ ﺳﻴﺸﺎر
ﻋﻦ اﳉﺪﻳﺪة. اﻟﻴﻬﺎ؟ اﻟﻴﻚ اﻻﻳﻌﺎز اﻟﺬي ﻗﻤﻨﺎ ﺑﻪ ﻟﻠﺘﺼﺮﻳﺢ ﻋﻦ ذﻟﻚ ،ﻣﻦ اﻟﻔﺼﻞ
ﺗﺒﲔ اﻟﻨﻮع اﳊﺪﻳﺚ ﻣﻦ اﻟﻨﺼﻮص و ﺳﻼﺳﻞ اﳊﺮوف وﺣﺘﻰ ﳝﻜﻨﻨﺎ ّ .[2] ١١
-وﻫﻮ ﻧﻮع ﻣﺘﻄﻮر ﺟﺪاَ ،-ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام Objective-Cﻫﺬﻩ ][3
;int *y
اﻟﻌﻼﻣﺔ @ ﻟﻠﺪﻻﻟﺔ ﻋﻠﻰ اﻧﻬﺎ ﻣﻦ اﻟﻨﻮع اﳉﺪﻳﺪ -ﺗﻨﻄﻖ ﻫﺬﻩ ﺻﻮﺗﻴ َﺎ
ﺑﻘﻮل "."At اﳌﺠﻤﻊ ﺑﺎن ﻣﺘﻐﻴﺮ اﳌﺆﺷﺮ yﻳﺤﺘﻮي ﻋﻨﻮان ﳊﻴﺰ ﻣﻦ
ﻟﻘﺪ اﻋﻠﻤﻨﺎ ّ
اﻟﺬاﻛﺮة .ﺣﻴﺚ ﺗﻮﺟﺪ ﻗﻴﻤﺔ ﻋﺪدﻳﺔ ﺻﺤﻴﺤﺔ ﻣﺨﺰﻧﺔ ﻫﻨﺎك.
ﺗﺮى ﻣﺎ اﻟﺘﻄﻮﻳﺮ اﻟﺬي اوﺟﺪﺗﻪ Objective-Cﻓﻲ
اﻟﻨﺼﻮص وﺳﻼﺳﻞ اﳊﺮوف ﻋﻦ ﺳﺎﺑﻘﺘﻬﺎ ﻟﻐﺔ C؟ اﳌﺠﻤﻊ ﺑﺎن اﳌﺘﻐﻴﺮ اﳌﺆﺷﺮ ﻫﺬا ﻳﺸﻴﺮ اﻟﻰ ﻋﻨﻮان
ﻓﻲ اﳌﺜﺎل ﻧﺤﻦ ﻧﺨﺒﺮ ّ
ﺑﺤﻴﺰ اﻟﺬاﻛﺮة ﺣﻴﺚ ﻳﻮﺟﺪ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع . NSString
٨٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ
][5 َ
اوﻻ Objective-Cﺗﺴﺘﺨﺪم ﺳﻼﺳﻞ ﺣﺮوف Unicodeاﻟﺸﺎﻣﻠﺔ
>#import <Foundation/Foundation.h
)][int main (int argc, const char *argv ﺑﻌﻜﺲ ﺳﻼﺳﻞ ﺣﺮوف ASCIIاﶈﺪودة اﳌﺴﺘﺨﺪﻣﻪ ﺑﻠﻐﺔ . C
{
= NSAutoreleasePool * pool ان ﺳﻼﺳﻞ ﺣﺮوف Unicodeاﻟﺸﺎﻣﻠﺔ ﲤﻜﻨﻚ ﻣﻦ ﻋﺮض اي ﺳﻠﺴﻠﺔ
;][[NSAutoreleasePool alloc] init ﻧﺼﻴﺔ ﺑﺄي ﻟﻐﺔ ﺣﻴﺔ ﺗﺘﺨﻴﻠﻬﺎ ﻣﻦ ﻛﺎﻟﺮوﺳﻴﺔ ،اﻟﺼﻴﻨﻲ ،اﻟﻌﺮﺑﻴﺔ،
;NSString *x ﺑﺎﻻﺿﺎﻓﺔ اﻟﻰ اﻟﻼﺗﻴﻨﻴﺔ Roman alphabetﻃﺒﻌ َﺎ!
]x = @”iBook”; // [5.7
x = @”MacBook Pro Intel”; // Hey, I’m ﺑﺎﻟﺘﺄﻛﻴﺪ ﳝﻜﻨﻚ اﻟﺘﺼﺮﻳﺢ وﺗﻬﺌﻴﺔ ﻣﺤﺘﻮى ﻣﺘﻐﻴﺮ اﳌﺆﺷﺮ ﺑﺴﻠﺴﻠﺔ
just trying to make ﻧﺼﻮص ،دﻓﻌﺔ واﺣﺪة ].[4
// this book
!look up to date ][4
;)NSLog(x ;”NSString *favoriteActress = @”Julia
;][pool release
;return 0
} ان ﻣﺘﻐﻴﺮ اﳌﺆﺷﺮ favoriteActressﻳﺸﻴﺮ اﻟﻰ ﻋﻨﻮان ﺣﻴﺰ ﻣﻦ اﻟﺬاﻛﺮة
ﺣﻴﺚ ﻳﻮﺟﺪ ذﻟﻚ اﻟﻜﺎﺋﻦ اﻟﺬي ﳝﺜﻞ وﻳﺤﺘﻔﻆ ﺑﺎﻟﺴﻠﺴﺔ اﻟﻨﺼﻴﺔ
ﻋﻨﺪ ﺗﻨﻔﻴﺬ ﻫﺬا اﻟﺒﺮﻧﺎﻣﺞ ،ﺳﻴﻄﺒﻊ ﻟﻚ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ :
”. “Julia
MacBook Pro Intel
ﻣﺎ ان ﺗﻨﺘﻬﻲ ﻣﻦ ﺗﻬﺌﻴﺔ اﳌﺘﻐﻴﺮ ) favoriteComputerﻓﻲ ﻣﺜﺎﻟﻨﺎ(،
ﺗﺪﻋﻰ NSString ان اي ﺳﻠﺴﻠﺔ ﺣﺮوف ﻣﻦ ﺳﻼﻟﺔ اﻟﺘﺼﻨﻴﻒ
ﳝﻜﻨﻚ ﻋﻨﺪﻫﺎ إﺳﻨﺎد ﻗﻴﻤﺔ أﺧﺮى اﻟﻴﻪ ،ﻻﺣﻆ اﻧﻚ ﻟﻦ ﺗﻜﻮن ﻗﺎدر
immutable،ﲟﻌﻨﻰ اﻧﻬﺎ ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻐﻴﺮ واﻟﺘﻌﺪﻳﻞ.
ﻋﻠﻰ ﺗﻐﻴﻴﺮ ﺳﻠﺴﻠﺔ اﻟﻨﺺ ذاﺗﻬﺎ ] [3وﻳﻌﻮد اﻟﺴﺒﺐ ﻓﻲ ذﻟﻚ ﻛﻮن
ﻣﺎﻟﻔﺎﺋﺪة ﻣﻦ وﺟﻮد ﺳﻠﺴﻠﺔ ﺣﺮوف ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻐﻴﻴﺮ؟ ﻫﺬﻩ اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ ﺳﻠﻴﻠﺔ اﻟﺘﺼﻨﻴﻒ NSStringﺑﺴﻠﺴﻠﺔ اﻟﻮراﺛﺔ.
ﺑﺼﺮاﺣﺔ ،ﻳﻜﻮن ﺗﻌﺎﻣﻞ اﻟﻨﻈﺎم ﻣﻊ ﺳﻼﺳﻞ اﳊﺮوف اﻟﻐﻴﺮ ﻗﺎﺑﻠﺔ و ﺳﻨﺘﺤﺪث ﻋﻦ ذﻟﻚ ﺧﻼل دﻗﻴﻘﺔ.اﻻن ﺗﺎﺑﻊ اﻟﻘﺮاءة...
ﻟﻠﺘﻌﺪﻳﻞ اﻳﺴﺮ واﺳﻬﻞ ،ﳑﺎ ﻳﻌﻨﻰ ان ﺑﺮﻧﺎﻣﺠﻚ ﺳﻴﻜﻮن اﺳﺮع .ﻓﻲ
٨٥
ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٨٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ
//...Continued
٨٧
ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻛﺎن اﳌﺘﻐﻴﺮ fooﻣﺸﻴﺮاَ اﻟﻰ ﺳﻠﺴﻠﺔ ﺣﺮوف ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ ﻛﺎﻧﺖ ][8
>#import <Foundation/Foundation.h
ﲢﺘﻮى ”!.“Julia
)][int main (int argc, const char * argv
ﻓﻲ ﺑﺪاﻳﺔ ﻓﺼﻠﻨﺎ ﻫﺬا اوﺿﺤﻨﺎ اﻻ ﻳﻜﻮن ﻫﻨﺎك اي ﺗﻌﺎﻣﻞ ﻣﻊ ﻛﺎﺋﻨﺎت {
Objective-Cﺑﺸﻜﻞ ﻣﺒﺎﺷﺮ .وان اي ﻋﻤﻠﻴﺎت ﺗﺪاول أو ﺗﻌﺎﻣﻞ ﻣﻊ = NSAutoreleasePool *pool
;][[NSAutoreleasePool alloc] init
اﻟﻜﺎﺋﻨﺎت ﻳﺘﻢ ﻣﻦ ﺧﻼل اﳌﺆﺷﺮات .واﻟﻴﻚ ﺳﺒﺐ ذﻟﻚ ،ﻓﻨﺤﻦ ﻗﺪ
اﺳﺘﺨﺪﻣﻨﺎ ﻣﺘﻐﻴﺮ ﻣﺆﺷﺮ ﺑﺎﻟﺴﻄﺮ ] .[8.7ﻓﻲ اﻟﻮاﻗﻊ ﻋﻨﺪﻣﺎ اﺳﺘﺨﺪﻣﻨﺎ ;NSMutableString *foo
]// [8.7
ﻣﻔﺮدة ”ﻛﺎﺋﻦ “object-إﳕﺎ ﻋﻨﻴﻨﺎ ﺑﺬﻟﻚ ”ﻣﺆﺷﺮ ﻟﻠﻜﺎﺋﻦ pointer ;]foo = [@”Julia!” mutableCopy
.“to an object ]// [8.8
;]”[foo appendString:@” I am happy
وﻃﺎﳌﺎ اﻧﻨﺎ ﻧﺴﺘﺨﺪم اﻟﻜﺎﺋﻨﺎت ﺑﺎﳌﺆﺷﺮات دوﻣ َﺎ ،ﻓﻘﺪ اﺳﺘﺨﺪﻣﻨﺎ ﻛﻠﻤﺔ ;)NSLog(@”Here is the result: %@.”, foo
٨٨
Xcode ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ
[pool release]; ﻋﻨﺪﻣﺎ ﻧﺮﻏﺐ ﺑﺎرﺳﺎل رﺳﺎﻟﺔ اﻟﻰ اﻟﻜﺎﺋﻦ ﻣﻦ ﺧﻼل،ﻓﻲ ﻫﺬﻩ اﳊﺎﻟﺔ
return 0; [ ( ﺳﻴﻜﻮن اﻻﺛﺮ ذاﺗﺔfoo dosomething]; )ﻛﺄن ﻧﻘﻮلfoo اﳌﺆﺷﺮ
}
،([bar dosomething]; ﻛﺄن ﻧﻘﻮلbar ﻛﻤﺎ ﻟﻮ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام
٨٩
ﺳﻼﺳﻞ اﳊﺮوف اﻟﻨﺼﻴﺔ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ان ﺗﻜﻮن ﻟﻚ اﻟﻘﺪرة ﻋﻠﻰ ﲤﺜﻴﻞ )او اﻻﺷﺎرة اﻟﻰ( ﻧﻔﺲ اﻟﻜﺎﺋﻦ ﻣﻦ
ﻋﺪة اﻣﺎﻛﻦ ،ذﻟﻚ ﻳﻌﺪ ﻣﻴﺰة ﻣﻦ اﻫﻢ ﳑﻴﺰات اﻟﺒﺮﻣﺠﺔ ﺑﺎﻟﻜﺎﺋﻨﺎت.
ﻓﻲ اﻟﻮاﻗﻊ ﻟﻘﺪ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام ﻫﺬﻩ اﳋﺎﺻﻴﺔ ﻓﻲ اﻟﻔﺼﻮل اﻟﺴﺎﺑﻘﺔ.
ﻼ ،ﻗﻤﻨﺎ ﺑﺘﻤﺜﻴﻞ اﻟﻜﺎﺋﻦ MAFooﻣﻦ ﺧﻼل ﻓﻔﻲ اﻟﻔﺼﻞ ٨ﻣﺜ َ
ﻛﺎﺋﻨﻲ اﻻزرارﻳﻦ.
٩٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﺼﻔﻮﻓﺎت
اﳌﺼﻔﻮﻓﺎت
ﻓﻲ ﺑﻌﺾ اﻻﺣﻴﺎن ﻳﺘﻄﻠﺐ اﻻﻣﺮ ﻣﻨﻚ ان ﲢﺘﻔﻆ ﲟﺠﻤﻮﻋﺔ ﻣﺘﺠﺎﻧﺴﺔ
ﻣﻦ اﻟﺒﻴﺎﻧﺎت .ﻛﺄن ﲢﺘﻔﻆ ﺑﻘﺎﺋﻤﺔ ﻣﻦ ﺳﻼﺳﻞ اﳊﺮوف ﻣﺜ َ
ﻼ .وﻗﺪ
ﻳﻜﻮن اﳊﻞ اﻟﻐﻴﺮ ﻋﻤﻠﻲ ان ﻧﻨﺸﻲء ﻣﺘﻐﻴﺮات ﻋﺪﻳﺪة ﺑﺤﻴﺚ ﻳﺤﺘﻔﻆ
ﻛﻞ ﻣﺘﻐﻴﺮ ﻣﻨﻬﺎ ﺑﺴﻠﺴﻠﺔ ﺣﺮوف .وﻟﻜﻦ اﳊﻞ اﻻﻓﻀﻞ وﺑﺎﻟﺘﺄﻛﻴﺪ
اﻟﻌﻤﻠﻲ ،ﻫﻮ ان ﻧﺴﺘﺨﺪم اﳌﺼﻔﻮﻓﺔ . -Array-
٩١
اﳌﺼﻔﻮﻓﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﺷﺮح اﻟﻨﺴﺨﺔ اﻟﻘﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ .وﻫﻨﺎك ﻃﺮﻳﻘﺔ واﺣﺪة ﻹﻧﺸﺎء أﻣﺎ ﻓﻲ اﳌﺼﻔﻮﻓﺎت ﻋﻠﻰ أﻳﺔ ﺣﺎل اﻻﻣﺮ ﻣﺨﺘﻠﻒ ﻓﺎﻟﻌﻨﺼﺮ اﻻول
اﳌﺼﻔﻮﻓﺔ ،وﻫﻲ ﺗﺘﻢ ﺑﺎﻻﻳﻌﺎز اﻟﺘﺎﻟﻲ: ﻳﺒﺪأ ﺑﺎﻟﺮﻗﻢ ﺻﻔﺮ )-zero indexوﻫﻮ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ اﻟﺬي ﻳﻘﺎﺑﻞ
][NSMutableArray array اﻟﻌﻨﺼﺮ اﻻول ﺑﺎﻟﻘﺎﺋﻤﺔ( ﻟﺬا ﺳﻴﻜﻮن اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﻌﻨﺼﺮ
ان ﺗﻨﻔﻴﺬ ﻫﺬ اﻻﻳﻌﺎز ،ﺳﻴﻌﻮد ﻋﻠﻴﻨﺎ ﲟﺼﻔﻮﻓﺔ ﻓﺎرﻏﺔ .وﻟﻜﻦ ﳊﻈﺔ... اﻟﺜﺎﻧﻲ ﻳﺴﺎوي ١ﺛﻢ اﻟﻌﻨﺼﺮ اﻟﺜﺎﻟﺚ ﲟﻘﺎﺑﻞ ﺗﺴﻠﺴﻠﻲ ﻳﺴﺎوي ٢
ﻫﺬا اﻻﻳﻌﺎز ﻳﺒﺪو ﻏﺮﻳﺒ َﺎ اﻟﻴﺲ ﻛﺬﻟﻚ؟ اﻧﻪ ﺑﺎﻟﺘﺄﻛﻴﺪ ﻏﺮﻳﺐ ﺟﺪاَ، ...وﻫﻜﺬا.
ﻓﻔﻲ ﻫﺬﻩ اﳊﺎﻟﺔ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﺳﻢ NSMutableArrayوﺣﺪدﻧﺎﻩ
ان ﻳﻜﻮن ﻛﻤﺴﺘﻘﺒﻞ ﻟﻠﺮﺳﺎﻟﺔ.
اﻟﻢ ﻳﻜﻦ ﻣﻦ اﳌﻔﺮوض ان ﻧﻘﻮم ﺑﺎرﺳﺎل رﺳﺎﺋﻠﻨﺎ إﻟﻰ ﻣﺴﺘﻨﺴﺦ
ﻻ ﻣﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﺗﺼﻨﻴﻒ اﻟﻜﺎﺋﻦ - اﻟﻜﺎﺋﻦ -instances-ﺑﺪ َ
class-؟
ﻣﺜﺎل :ﻣﺼﻔﻮﻓﺔ ﲢﺘﻮي ﺛﻼﺛﺔ ) (٣ﺳﻼﺳﻞ ﺣﺮﻓﻴﺔ.
ﻓﻲ اﳊﻘﻴﻘﺔ ﻟﻘﺪ ﺗﻌﻠﻤﻨﺎ ﺷﻲء ﺟﺪﻳﺪ :اﻧﻬﺎ ﺣﻘﻴﻘﺔ ﻣﻦ ﺣﻘﺎﺋﻖ
Objective-Cﺣﻴﺚ ﺗﺘﻴﺢ ﻟﻨﺎ ارﺳﺎل اﻟﺮﺳﺎﺋﻞ اﻟﻰ اﻟﺘﺼﻨﻴﻔﺎت ﺳﻨﺰودك ﺑﺄﻣﺜﻠﺔ ﻟﻠﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻻﺣﻘ َﺎ ﺧﻼل ﻫﺬا اﻟﻔﺼﻞ،
classesاﻻﺻﻠﻴﺔ )ﻳﻌﻮد ﺳﺒﺐ ذﻟﻚ ان اﻟﺘﺼﻨﻴﻔﺎت classesذاﺗﻬﺎ ﻟﻨﻤﻜﻨﻚ ﻣﻦ ﻣﻼﻣﺴﺔ اﻻﺛﺮ اﻟﺬي ﻳﺤﺪﺛﺔ اﻟﺘﻌﺪاد اﺑﺘﺪا َء ﻣﻦ
ﻋﺒﺎرة ﻋﻦ ﻛﺎﺋﻨﺎت ،وﺑﺪورﻫﺎ ﻫﻲ اﻳﻀ ًﺎ ﻣﺴﺘﻨﺴﺨﺎت ﻳﻄﻠﻖ ﻋﻠﻴﻬﺎ اﻟﺼﻔﺮ.اﳌﺼﻔﻮﻓﺎت ﺗﺄﺗﻴﻚ ﻛﺘﺼﻨﻴﻔﺎن :اﻟﺘﺼﻨﻴﻒ اﻻول NSArray
،meta-classesوﻟﻜﻨﻨﺎ ﺳﻨﺘﻮﻗﻒ ﻋﻦ ﺷﺮح ﻫﺬﻩ اﻟﻔﻜﺮة ﻟﻌﺪم واﻟﺜﺎﻧﻲ .NSMutableArrayﻛﻤﺎ ﻫﻮ اﳊﺎل ﻣﻊ ﺳﻼﺳﻞ اﳊﺮوف
ﻣﻨﺎﺳﺒﺘﻬﺎ ﻻن ﺗﻜﻮن ﺑﻜﺘﺎب ﻳﻔﺘﺮض ان ﻳﻜﻮن ﺗﻘﺪﳝﻲ ﻟﻠﻤﺒﺘﺪﺋﲔ، .strings
وﻛﺬﻟﻚ ﺷﺮﺣﻬﺎ ﺳﻴﻄﻮل ﺟﺪا(. ﻓﻬﻨﺎك ﻧﺴﺨﺔ ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻐﻴﺮ واﻟﺘﻌﺪﻳﻞ immutableوﻫﻨﺎك ﻧﺴﺨﺔ
ﻣﻦ وﺛﺎﺋﻖ ،Cocoaﳒﺪ ان اﻻﺟﺮاءات اﻟﺘﻲ ﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻠﻰ ﻣﻬﻤﺘﻬﺎ اﻟﺘﻐﻴﻴﺮ واﻟﺘﺒﺪﻳﻞ .mutableﻓﻲ ﻫﺬا اﻟﻔﺼﻞ ،ﺳﻨﺴﺘﻬﺪف
٩٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﺼﻔﻮﻓﺎت
NSMutableArray *myArray = [NSMutableArray اﻟﺘﺼﻨﻴﻒ ذاﺗﻪ ﺗﻜﻮن ﺑﺎدﺋﺘﻬﺎ ﺑﺎﻟﺮﻣﺰ ”َ “+
ﺑﺪﻻ ﻣﻦ اﻟﺮﻣﺰ ” “-اﻟﺒﺎدىء
;]array
اﻣﺎم اﻻﺟﺮاءات اﻟﺘﻲ ﺗﺮﺳﻞ اﻟﻰ اﻟﻜﺎﺋﻨﺎت) .اﻧﻈﺮ اﳌﺜﺎل ] [4.5اﻟﺬي
;]”[myArray addObject:@”first string
;]”[myArray addObject:@”second string
ورد ذﻛﺮﻩ ﺑﺎﻟﻔﺼﻞ .(٨وﻛﻤﺜﺎل ﻧﺮى ان اﻟﻮﺛﺎﺋﻖ ﺗﺼﻒ إﺟﺮاءات
;]”[myArray addObject:@”third string اﳌﺼﻔﻮﻓﺔ ﻛﻤﺎ ﻳﻠﻲ:
array
;]int count = [myArray count
+ (id)array
Creates and returns an empty array. This method is used
NSLog(@”There are %d elements in my
by mutable subclasses of
;)array”, count
NSArray.
See Also: + arrayWithObject:, + arrayWithObjects:
;][pool release
;return 0
}
دﻋﻨﺎ ﻧﻄﺒﻖ ﻣﺎ ﻗﺮأﻧﺎﻩ ﺳﺎﺑﻘ َﺎ ﻣﻦ ﺧﻼل اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ .ﻓﺒﺮﻧﺎﻣﺠﻨﺎ
ﻋﻨﺪ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ ،ﺳﻴﻄﺒﻊ ﻟﻨﺎ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ: اﻟﺘﺎﻟﻲ ﺳﻴﻘﻮم ﺑﺈﻧﺸﺎء ﻣﺼﻔﻮﻓﺔ ﻓﺎرﻏﺔ ،ﻟﻴﺴﺘﻮدع ﺑﻬﺎ ٣ﺳﻼﺳﻞ
There are 3 elements in my array
ﺣﺮﻓﻴﺔ ،ﺛﻢ ﻳﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﻌﺪد اﳌﻤﺜﻞ ﳌﺠﻤﻮع اﻟﻌﻨﺎﺻﺮ ﺑﺎﳌﺼﻔﻮﻓﺔ.
ﺑﺮﻧﺎﻣﺠﻨﺎ اﻟﺘﺎﻟﻲ ﻣﺸﺎﺑﻪ ﳌﺎ ﻗﺒﻠﻪ اﻻ ان ﻫﺬا ﺳﻮف ﻳﻘﻮم ﺑﻄﺒﺎﻋﺔ ][1
ﺳﻠﺴﻠﺔ اﳊﺮوف اﳌﻮﺟﻮدة ﺑﺎﻟﺘﺴﻠﺴﻠﻲ )ﺻﻔﺮ( داﺧﻞ اﳌﺼﻔﻮﻓﺔ - >#import <Foundation/Foundation.h
اي اﻟﻌﻨﺼﺮ اﻻول .-ﺣﺘﻰ ﻧﺘﻤﻜﻦ ﻣﻦ اﻟﻮﺻﻮل ﻟﻌﻨﺼﺮ ﺑﺎﳌﺼﻔﻮﻓﺔ )][int main (int argc, const char * argv
ﻧﺴﺘﺨﺪم اﻻﺟﺮاء objectAtIndex:ﻛﻤﺎ ﻳﻠﻲ]:[2.13 {
= NSAutoreleasePool *pool
;][[NSAutoreleasePool alloc] init
//...Contined
٩٣
اﳌﺼﻔﻮﻓﺎت Xcode ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ
int main (int argc, const char * argv[]) [myArray addObject:@”first string”];
{ [myArray addObject:@”second string”];
NSAutoreleasePool *pool = [myArray addObject:@”third string”];
[[NSAutoreleasePool alloc] init];
NSString *element = [myArray
NSMutableArray *myArray = [NSMutableArray objectAtIndex:0]; // [2.13]
array];
[myArray addObject:@”first string”]; NSLog(@”The element at index 0 in the
[myArray addObject:@”second string”]; array is: %@”, element);
[myArray addObject:@”third string”];
[pool release];
int i; return 0;
int count; }
for (i = 0, count = [myArray count]; i <
count; i = i + 1) :ﻋﻨﺪ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺳﻴﻄﺒﻊ اﻟﺴﻄﺮ اﻟﺘﺎﻟﻲ
The element at index 0 in the array is:
//... continued
first string
٩٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode اﳌﺼﻔﻮﻓﺎت
ﺗﺴﻤﺢ Objective-Cﻟﻺﺟﺮاءات ﺑﺄن ﲢﺘﻮى اي ﻋﺪد ﻣﻦ اﳌﻌﺎﻣﻼت ﻋﻨﺪ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺳﻴﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻣﺎﻳﻠﻲ ﻋﻠﻰ اﻟﺸﺎﺷﺔ:
.-arguments-وﻫﻨﺎ ﻧﺮى ﻛﻴﻒ ﳝﻜﻨﻨﺎ اﺳﺘﺨﺪام ﻫﺬا اﻻﺟﺮاء. The element at index 0 in the array is:
first string
][4 The element at index 1 in the array is:
[myArray replaceObjectAtIndex:1 second string
;]”withObject:@”Hello The element at index 2 in the array is:
third string
ﺑﻌﺪ ﺗﻨﻔﻴﺬ ﻫﺬا اﻻﺟﺮاء ،ﺳﻴﻜﻮن اﻟﻌﻨﺼﺮ اﻟﺜﺎﻧﻲ ذي اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ
١ﻣﺤﺘﻮﻳ َﺎ ﻟﺴﻠﺴﻠﺔ اﳊﺮوف ” . @”Helloﺑﻜﻞ ﺗﺄﻛﻴﺪ ﻳﺠﺐ ﺗﻨﻔﻴﺬ ﻻﺣﻆ ﻟﻠﻤﺼﻔﻮﻓﺎت اﻟﻘﺎﺑﻠﻴﺔ ان ﲢﺘﻮي اي ﻛﺎﺋﻨﺎت اﺧﺮى ﻓﻬﻲ
ﻫﺬا اﻻﺟﺮاء ﺑﻮﺟﻮد رﻗﻢ ﺗﺴﻠﺴﻠﻲ ﻣﻮﺟﻮد .ﲟﻌﻨﻰ ﻳﺠﺐ ان ﻳﻜﻮن ﻟﻴﺴﺖ ﻣﺤﺼﻮرة ﺑﺘﺨﺰﻳﻦ ﺳﻼﺳﻞ اﳊﺮوف ﻓﻘﻂ.
ﻫﻨﺎك ﻋﻨﺼﺮ ﻣﺨﺰن ﺑﺎﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ اﳌﺬﻛﻮر ،ﺣﺘﻰ ﻳﺘﻤﻜﻦ اﻻﺟﺮاء ﻳﺰودك ﺗﺼﻨﻴﻔﻲ NSMutableArrayو NSArrayﺑﻌﺪة إﺟﺮاءات،
ﻣﻦ ﺗﻨﻔﻴﺬ ﻋﻤﻠﻴﺔ اﻻﺳﺘﺒﺪال ﺑﺎﻟﻜﺎﺋﻦ ﻗﻴﺪ اﻟﺒﺪل. وﻧﻨﺼﺤﻚ ان ﺗﻄﺎﻟﻊ ﻣﺎ ﲢﺘﻮﻳﺔ وﺛﺎﺋﻖ اﳌﺴﺎﻋﺪة ﻟﻬﺬﻳﻦ اﻟﺘﺼﻨﻴﻔﲔ
ﻛﻤﺎ ﺗﺮى ﻣﻦ اﳌﺜﺎل ،ان اﺳﻤﺎء اﻹﺟﺮاءات ﺑـ Objective-Cﻣﺜﻞ ﺣﺘﻰ ﺗﺘﻤﻜﻦ ﻣﻦ اﻟﺘﻌﺮف اﻛﺜﺮ ﻋﻠﻰ ﻓﻮاﺋﺪ وﳑﻴﺰات اﳌﺼﻔﻮﻓﺎت.
اﳉﻤﻞ اﻟﺘﻲ ﺗﺘﻄﻠﺐ ﻣﻨﻚ ان ﲤﻞء ﻓﺮاﻏﺎﺗﻬﺎ) .اﻟﻔﺮاغ اﳌﻄﻠﻮب ﻣﻠﺌﻪ وﺳﻨﻘﻮم ﺑﺎﻧﻬﺎء ﻫﺬا اﻟﻔﺼﻞ ﻣﻦ ﺧﻼل ﺣﺪﻳﺜﻨﺎ ﻋﻦ اﻻﺟﺮاء اﻟﺬي
٩٥
اﳌﺼﻔﻮﻓﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٩٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode إدارة اﻟﺬاﻛﺮة
إدارة اﻟﺬاﻛﺮة
ﻗﺪﻣﺖ اﻋﺘﺬاري ﺑﺎﻛﺜﺮ ﻣﻦ ﻓﺼﻞ ﺳﺎﺑﻖ ،ﺣﻮل ﺗﻔﺴﻴﺮ ﺑﻌﺾ اﻻﻳﻌﺎزات
اﻟﺘﻲ ﺳﻮف ﻧﺘﻨﺎوﻟﻬﺎ ﻫﻨﺎ .ﻓﻬﺬﻩ اﻻﻳﻌﺎزات ﺗﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺬاﻛﺮة.ﻓﻜﻤﺎ
ﺗﺮى إن ﺑﺮﻧﺎﻣﺠﻚ ﻟﻴﺲ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻮﺣﻴﺪ ﺑﺠﻬﺎز اﳌﺎﻛﻨﺘﻮش ،ﺣﻴﺚ
ﺗﻜﻮن اﻟﺬاﻛﺮة RAMﻣﺤﺪودة ﻛﺎﻟﻌﻤﻠﺔ اﻟﺼﻌﺒﺔ .ﻟﺬا ﻓﻲ ﺣﺎل ﻟﻢ
ﻳﻌﺪ ﺑﺮﻧﺎﻣﺠﻚ ﺑﺤﺎﺟﺔ ﻟﺬﻟﻚ اﳉﺰء اﶈﺠﻮز ﻣﻦ اﻟﺬاﻛﺮة ،ﻳﺠﺐ ﻋﻠﻴﻪ
ﻋﻨﺪﻫﺎ إﻋﺎدة ذﻟﻚ اﳉﺰء إﻟﻰ اﻟﻨﻈﺎم.
ﻟﻘﺪ اﺣﺴﻨﺖ واﻟﺪﺗﻚ ﺗﺮﺑﻴﺘﻚ ﻋﻨﺪﻣﺎ اﺧﺒﺮﺗﻚ ﺑﺄن ﺗﻜﻮن ﻣﺘﺄدﺑ َﺎ وان
ﺗﺘﻌﺎﻳﺶ ﻣﻊ ﺑﺎﻗﻲ أﻓﺮاد ﻣﺠﺘﻤﻌﻚ ،ﻟﻘﺪ ﻛﺎﻧﺖ ﺗﻌﻠﻤﻚ ﺑﻄﺮﻳﻘﺔ ﻣﺎ
ﻛﻴﻒ ﻳﻜﻮن اﻟﺒﺮﻧﺎﻣﺞ!
وﺣﺘﻰ ﻟﻮ ﻛﺎن ﺑﺮﻧﺎﻣﺠﻚ ﻫﻮ اﻟﻮﺣﻴﺪ ﻗﻴﺪ اﻟﺘﺸﻐﻴﻞ ،ﻓﺈن ﻋﺪم ﻓﻚ
اﳊﺠﺰ ﻋﻦ اﻟﺬاﻛﺮة وإﺳﺘﻬﻼك اﳌﺰﻳﺪ ﻳﺆدي اﻟﻰ ﺣﻜﺮ ﺑﺮﻧﺎﻣﺠﻚ
ﺗﺪرﻳﺠﻴ َﺎ ﺑﺮﻛﻦ ﻳﺼﻌﺐ اﳋﺮوج ﻣﻨﻪ ،وﺳﻴﻜﻮن أداء ﺣﺎﺳﺒﻚ ﺑﻄﻲء
ﺟﺪاَ ﻟﺪرﺟﺔ اﳊﺒﻮ.
ﻋﻨﺪﻣﺎ ﻳﻘﻮم ﺑﺮﻧﺎﻣﺠﻚ ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﺟﺪﻳﺪ ،ﺳﻴﺤﺘﻞ اﻻﺧﻴﺮ ﺟﺰء
ﻣﻦ ﻣﺴﺎﺣﺔ اﻟﺬاﻛﺮة وﺳﻴﻜﻮن ﻣﻦ واﺟﺒﻚ إﺧﻼء وﻓﻚ ﺣﺠﺰ ذﻟﻚ
اﳉﺰء ﻣﻦ اﻟﺬاﻛﺮة ﻣﺘﻰ ﻣﺎ اﻧﻌﺪﻣﺖ ﺣﺎﺟﺘﻚ ﻟﻮﺟﻮد ذﻟﻚ اﻟﻜﺎﺋﻦ .ان
٩٧
إدارة اﻟﺬاﻛﺮة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻣﺘﻰ ﻣﺎ اﺻﺒﺤﺖ ﻗﻴﻤﺔ ﻋﺪاد اﻟﺮواﺑﻂ ﻣﺴﺎوﻳﺔ ﻟﺼﻔﺮ ،ﻳﻌﻠﻢ اﻟﻜﺎﺋﻦ اﻧﻌﺪام ﺣﺎﺟﺘﻚ ﻟﻠﻜﺎﺋﻦ ﲢﺘﻢ ﻋﻠﻴﻚ إﻓﻨﺎءة/ﺗﺪﻣﻴﺮﻩ وإﺧﻼء اﳌﺴﺎﺣﺔ
ﻋﻨﺪﻫﺎ اﻧﻪ ﻻ ﻳﻮﺟﺪ اﺣﺪ ﻣﺮﺗﺒﻂ ﺑﻪ واﻧﻪ ﳝﻜﻨﻪ ﻋﻨﺪﻫﺎ ﺗﺪﻣﻴﺮ ذاﺗﻪ، اﻟﺘﻲ ﻛﺎن ﻳﺤﺘﺠﺰﻫﺎ.ﻋﻠﻰ ﻛﻞ ﺣﺎل ،ﺗﻘﺮﻳﺮ ﻣﺼﻴﺮ اﻟﻜﺎﺋﻦ ﻣﻦ ﺧﻼل
ﻣﺨﻠﺼ َﺎ ﺑﺬﻟﻚ اﳊﻴﺰ اﻟﺬي ﻛﺎن ﻳﺤﺘﻠﻪ ﻣﻦ اﻟﺬاﻛﺮة. ﻣﺪى ﺣﺎﺟﺘﻚ ﻗﺪ ﻻ ﻳﻜﻮن ﺑﺎﻻﻣﺮ اﻟﻴﺴﻴﺮ.
ﻛﻤﺜﺎل ،ﻟﻨﻔﺮض ان ﺑﺮﻧﺎﻣﺠﻚ ﻋﺒﺎرة ﻋﻦ ﻣﺸﻐﻞ ﻣﻮﺳﻴﻘﻲ وﻟﺪﻳﻚ ﻛﻤﺜﺎل ،واﺛﻨﺎء ﺗﺸﻐﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ ،ﻗﺪ ﻳﻜﻮن ﻛﺎﺋﻨﻚ ﻫﺬا ﻣﺴﺘﺨﺪﻣ َﺎ
ﻛﺎﺋﻨﺎت ﲤﺜﻞ ”اﻻﻏﻨﻴﺎت“ وأﺧﺮى ﲤﺜﻞ ”ﻗﻮاﺋﻢ اﺳﻤﺎء اﻻﻏﻨﻴﺎت“. ﻣﻦ ﻗﺒﻞ ﻋﺪة ﻛﺎﺋﻨﺎت ﺗﺸﻴﺮ اﻟﻴﻪ ﻣﺮﺟﻌﻴ َﺎ ،ﻋﻨﺪﻫﺎ ﻳﺠﺪر ﺑﻚ اﻻ
ﻟﻨﻔﺮض ان ﻛﺎﺋﻦ ”اﻏﻨﻴﺔ“ ﻣﺮﺗﺒﻂ ﺑﺈﺷﺎرة ﻣﺮﺟﻌﻴﺔ ﻣﻦ ﻗﺒﻞ ٣ﻛﺎﺋﻨﺎت ﺗﻘﻮم ﺑﺘﺪﻣﻴﺮﻩ ﻻﺣﺘﻤﺎل ان ﻳﻘﻮم اﺣﺪ ﺗﻠﻚ اﻟﻜﺎﺋﻨﺎت اﻻﺧﺮى
”ﻗﻮاﺋﻢ أﺳﻤﺎء اﻻﻏﻨﻴﺎت“ .ﻋﻨﺪﻫﺎ ﺳﺘﻜﻮن ﻗﻴﻤﺔ ﻋﺪاد رواﺑﻂ اﻟﻜﺎﺋﻦ ﺑﺈﺳﺘﺨﺪاﻣﻪ.
”اﻏﻨﻴﺔ“ ﻣﺴﺎوﻳﺔ ﻟـ.٣
)ان ﻣﺠﺮد ﻣﺤﺎوﻟﺔ اﺳﺘﺨﺪام ﻛﺎﺋﻦ ﰎ ﺗﺪﻣﻴﺮﻩ ﺗﺆدي اﻟﻰ
ﺗﻮﻗﻒ ﺑﺮﻧﺎﻣﺠﻚ ﻋﻦ اﻟﻌﻤﻞ crashأو ﻳﺘﺼﺮف ﺑﻄﺮﻳﻘﺔ
ﻏﻴﺮ اﳌﻘﺮرة(
وﻟﻠﻤﺴﺎﻋﺪة ﻓﻲ ﺗﻘﺮﻳﺮ ﻋﻤﻠﻴﺔ إﻓﻨﺎء اﻟﻜﺎﺋﻦ ﻋﻨﺪ اﻧﻌﺪام اﳊﺎﺟﺔ إﻟﻴﻪ،
ﺗﻘﺪم ﻟﻚ Cocoaﻣﺒﺪأ رﺑﻂ اﻟﻜﺎﺋﻦ ﺑﺎﻟﻌﺪاد ،وﻫﻮ ﳝﺜﻞ ﻣﺎ ﻳﻄﻠﻖ
ﻋﻠﻴﻪ ”"ﻋﺪاد اﻟﺮواﺑﻂ “retain countاﳋﺎص ﺑﻜﻞ ﻛﺎﺋﻦ.
ﻓﻔﻲ ﺑﺮﻧﺎﻣﺠﻚ ﻣﺘﻰ ﻣﺎ ﻋﻴﻨﺖ اﺷﺎرة ﻣﺮﺟﻌﻴﺔ -reference-ﻻﺣﺪ
اﻟﻜﺎﺋﻨﺎت ،وﺟﺐ ﻋﻠﻴﻚ ﻋﻨﺪﻫﺎ اﻋﻼم ذﻟﻚ اﻟﻜﺎﺋﻦ ،ﺣﻴﺚ ﺗﻘﻮم
ﻳﺴﺘﻄﻴﻊ اﻟﻜﺎﺋﻦ ﻣﻌﺮﻓﺔ ﻋﺪد اﻻﺷﺎرات اﻟﻴﻪ.
ﺑﺰﻳﺎدة ﻋﺪاد رواﺑﻄﻪ ﺑﻘﻴﻤﺔ ﻣﻘﺪارﻫﺎ .١وﻣﺘﻰ ﻣﺎ ﻗﻤﺖ ﺑﺈزاﻟﺔ ﺗﻠﻚ
ﻟﻘﺪ اﺻﺒﺢ ﻟﻠﻜﺎﺋﻦ اﻟﻘﺪرة ﻋﻠﻰ ﻣﻌﺮﻓﺔ ﻋﺪد اﳌﺮات اﻟﺘﻲ ﲤﺖ اﻻﺷﺎرة اﻻﺷﺎرة اﳌﺮﺟﻌﻴﺔ ،وﺟﺐ ﻋﻠﻴﻚ اﻟﻘﻴﺎم ﺑﺈﻧﻘﺎص ﻋﺪاد رواﺑﻄﻪ ﺑﻘﻴﻤﺔ
اﻟﻴﻪ ،واﻟﻔﻀﻞ ﻓﻲ ذﻟﻚ ﻳﻌﻮد اﻟﻰ ﻋﺪاد اﻟﺮواﺑﻂ .وﻟﻠﻘﻴﺎم ﺑﺰﻳﺎدة ﻣﻘﺪارﻫﺎ .١
٩٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode إدارة اﻟﺬاﻛﺮة
اﻓﺼﺢ ﺑﻌﺾ ﻣﻬﻨﺪﺳﻲ أﭘﻞ ﻋﻦ ﺗﻮﺟﻬﻬﺎ ﻟﺘﻄﻮﻳﺮ ﳕﻮذج آﻟﻴﺔ ﺟﺪﻳﺪة ﻋﺪاد اﻟﺮواﺑﻂ ﻻﺣﺪ اﻟﻜﺎﺋﻨﺎت ،ﻛﻞ ﻣﺎ ﻋﻠﻴﻨﺎ ﻋﻤﻠﻪ ﻫﻮ ارﺳﺎل رﺳﺎﻟﺔ
ﺗﻌﺮف ﺑﺎﺳﻢ ” .“automatic garbage collectionﺣﻴﺚ ﺳﺘﻜﻮن retainﻟﺬﻟﻚ اﻟﻜﺎﺋﻦ .اﻣﺎ ﻓﻲ ﺣﺎل رﻏﺒﺘﻨﺎ ﺑﺈﻧﻘﺎص ﻋﺪاد اﻟﺮواﺑﻂ
ﻫﺬﻩ اﻻﻟﻴﺔ اﻛﺜﺮ ﻗﻮة ﻣﻦ اﻟﻮﺳﺎﺋﻞ اﳊﺎﻟﻴﺔ ،وذات اﺳﺘﺨﺪام اﺳﻬﻞ ﻋﻨﺪﻫﺎ ﻧﺮﺳﻞ ﻟﻪ رﺳﺎﻟﺔ . release
وﺑﻨﺴﺒﺔ اﺧﻄﺎء اﻗﻞ وﻗﺖ ﻛﺘﺎﺑﺔ ﻫﺬا اﻟﻜﺘﺎب. ”“autorelease pool ﺗﻘﺪم ﻟﻚ Cocoaآﻟﻴﺔ ﻋﻤﻞ آﺧﺮى ﺗﺪﻋﻰ
ﻋﻠﻰ ﻛﻞ ﺣﺎل ﻻ ﺗﻮﺟﺪ ﺿﻤﺎﻧﻪ ﻋﻤﺎ اذا ﻛﺎﻧﺖ ﻫﺬﻩ اﻟﺘﻜﻨﻮﻟﻮﺟﻴﺎ ﲤﻜﻨﻚ ﻣﻦ ارﺳﺎل رﺳﺎﻟﺔ releaseﻣﺘﺄﺧﺮة ﻟﺬﻟﻚ اﻟﻜﺎﺋﻦ. وﻫﻲ ّ
ﻣﻜﺘﻤﻠﺔ ،أو ﻣﺘﻰ ﺳﺘﻘﻮم أﭘﻞ ﺑﺘﺰوﻳﺪﻫﺎ ﻓﻲ .Cocoa delayed message -ﲟﻌﻨﻰ اﻧﻬﺎ ﻟﻴﺴﺖ ﻗﻴﺪ اﻻرﺳﺎل َ
ﺣﺎﻻ ﺑﻞ
ﺑﻌﺪ ﺗﺨﻀﻊ ﻟﻔﺘﺮة ﻣﺘﺄﺧﺮة ﻣﻦ اﻟﺰﻣﻦ .وﻻﺳﺘﺨﺪام ﻫﺬﻩ اﻵﻟﻴﺔ،
ﻛﻞ ﻣﺎ ﻋﻠﻴﻚ ﻋﻤﻠﻪ ﻫﻮ ﺗﺴﺠﻴﻞ ذﻟﻚ اﻟﻜﺎﺋﻦ ﺑﻘﺎﺋﻤﺔ ﻣﺎ ﻳﺴﻤﻰ
” ،“autorelease poolﻣﻦ ﺧﻼل ارﺳﺎل رﺳﺎﻟﺔ . autorelease
وﺳﺘﻘﻮم ﻋﻨﺪﻫﺎ آﻟﻴﺔ ” “autorelease poolﺑﺎﻟﺘﻜﻔﻞ ﺑﻌﻤﻠﻴﺔ ارﺳﺎل
رﺳﺎﻟﺔ releaseاﳌﺘﺄﺧﺮة إﻟﻰ ذﻟﻚ اﻟﻜﺎﺋﻦ اﳌﺴﺠﻞ ﻣﻌﻬﺎ.
إذاً اﻻﻳﻌﺎزات اﻟﺘﻲ ﺗﺘﻜﻔﻞ ﺑﻬﺎ ” “autorelease poolوﻗﺪ رأﻳﻨﺎﻫﺎ
ﻓﻲ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﺑﺎﻷﻣﺜﻠﺔ اﻟﺴﺎﺑﻘﺔ ،ﻫﻲ اﻳﻌﺎزات ﻣﻮﺟﻬﺔ ﻟﻨﻈﺎم
اﻟﺘﺸﻐﻴﻞ ﺣﺘﻰ ﻳﺘﻜﻔﻞ ﺑﺘﻬﻴﺌﺔ آﻟﻴﺔ ﻋﻤﻞ ”.“autorelease pool
ان ﻋﻤﻠﻴﺔ ادارة اﻟﺬاﻛﺮة اﳌﺴﺘﺨﺪﻣﺔ ﻣﻦ ﻗﺒﻞ Cocoaواﻟﺘﻲ ﰎ ﻋﺮﺿﻬﺎ
ﺑﻬﺬا اﻟﻔﺼﻞ ﺗُﻌﺮف ﻋﺎدة ﲟﺴﻤﻰ ” .“reference countingوﺳﻮف
ﲡﺪ ﺷﺮﺣ َﺎ واﻓﻴﺎ ﺣﻮل ﻧﻈﺎم Cocoaﻻدارة اﻟﺬاﻛﺮة ﺑﻜﺘﺐ و ﻣﻮاﺿﻴﻊ
ﻣﺘﻘﺪﻣﺔ )اﻧﻈﺮ اﻟﻔﺼﻞ .(١٥
٩٩
إدارة اﻟﺬاﻛﺮة ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺼﺎدر اﳌﻌﻠﻮﻣﺎت
ﻣﺼﺎدر اﳌﻌﻠﻮﻣﺎت
ان اﻟﻬﺪف اﻻﺳﻤﻰ ﻟﻬﺬا اﻟﻜﺘﺎب ﻫﻮ ﺗﻌﻠﻴﻤﻚ اﺳﺲ ﻟﻐﺔ Objective-
Cﻣﻦ ﺧﻼل ﺑﻴﺌﺔ .Xcodeﻓﺎذا ﺻﺪف ان ﻗﺮأت ﻫﺬا اﻟﻜﺘﺎب ﻣﺮﺗﲔ،
وﻗﻤﺖ ﺑﺘﺠﺮﻳﺐ اﻻﻣﺜﻠﺔ واﺿﻔﺖ ﲡﺎرﺑﻚ ﻋﻠﻴﻬﺎ ،ﻋﻨﺪﻫﺎ ﺗﺄﻛﺪ اﻧﻚ
ﺟﺎﻫﺰ ﻻن ﺗﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﻋﻤﻞ ﺑﺮﻧﺎﻣﺠﻚ اﻟﻔﺘﺎك ،اﻟﺬي ﻃﺎﳌﺎ رﻏﺒﺖ
ﺑﻜﺘﺎﺑﺘﻪ.
ﻫﺬا اﻟﻜﺘﺎب ﻳﺰودك ﲟﻔﺎﺗﻴﺢ اﳌﻌﺮﻓﺔ اﻻوﻟﻴﺔ ،و اﻟﻜﺎﻓﻴﺔ ﻟﺘﺘﻌﻤﻖ
اﳌﺸﺎﻛﻞ اﻟﺒﺮﻣﺠﻴﺔ ﺑﺸﻜﻞ اﺳﺮع .وﲟﺎ اﻧﻚ ﻻ ﺗﺰال ﻣﻌﻨﺎ ﺣﺘﻰ ﻫﺬا
اﻟﻔﺼﻞ ،ﻓﺎﻧﻚ ﺣﺘﻤ َﺎ ﺟﺎﻫﺰ ﻻن ﺗﻐﺰو اﳌﺼﺎدر اﳌﻌﻠﻮﻣﺎﺗﻴﺔ اﻻﺧﺮى،
وﻣﺎ ﺳﻨﺬﻛﺮﻩ ﻫﻨﺎ ﺳﻴﻠﻔﺖ اﻧﺘﺒﺎﻫﻚ.
ﻧﺼﻴﺤﺔ ﻣﻬﻤﺔ ﻗﺒﻞ ان ﺗﺒﺪأ ﺑﻜﺘﺎﺑﺔ ﺷﻔﺮﺗﻚ اﻟﺒﺮﻣﺠﻴﺔ:
ﻼ! وﺗﻔﺤﺺ ﻫﻴﺎﻛﻞ ﻻﺗﺒﺪأ ﺑﺈﻧﺪﻓﺎع ،أﺑﺪ َا ! ﺑﻞ ﺗﺮوى ﻗﻠﻴ َ
اﻟﻌﻤﻞ frameworksاﳌﺘﻮﻓﺮة...
ذﻟﻚ ان أﭘﻞ ،ﻏﺎﻟﺒ َﺎ ﻣﺎ ﻗﺎﻣﺖ ﻋﻨﻚ ﺑﺎﻟﻌﻤﻞ ،أو زودﺗﻚ ﺑﺘﺼﻨﻴﻔﺎت
ﺗﺘﻄﻠﺐ اﻟﻘﻠﻴﻞ ﻣﻦ اﻟﺘﻌﺪﻳﻞ ﻟﺘﺤﻘﻖ ﻣﺎ ﺗﺮﻳﺪ .ﻛﺬﻟﻚ ﻣﻦ اﳌﻤﻜﻦ
ان ﻳﻜﻮن اﺣﺪﻫﻢ ﻗﺪ ﻗﺎم ﺑﺈﳒﺎز ﻣﺎ ﲢﺘﺎج ﺗﺼﻤﻴﻤﻪ واﺗﺎح ﺷﻔﺮﺗﻪ
اﳌﺼﺪرﻳﺔ -open source-ﻟﻠﺠﻤﻬﻮر .ﻟﺬا وﻓﺮ ﻋﻠﻰ ﻧﻔﺴﻚ اﻟﻌﻨﺎء
١٠١
ﻣﺼﺎدر اﳌﻌﻠﻮﻣﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
http://www.cocoabuilder.com
ﻣﻦ ﺧﻼل ﻣﻄﺎﻟﻌﺘﻚ ﻟﻮﺛﺎﺋﻖ اﳌﺴﺎﻋﺪة واﻟﺒﺤﺚ ﺑﺎﻻﻧﺘﺮﻧﺖ .واول
وﻟﻠﻤﻌﻠﻮﻣﺎت واﻟﻨﺼﺎﺋﺢ ﺣﻮل اﺗﻴﻜﻴﺖ ﻓﻦ اﻟﺘﺨﺎﻃﺐ وﻃﺮح اﻻﺳﺌﻠﺔ ﻣﺼﺪر ﻳﺠﺪر ﺑﻚ زﻳﺎرﺗﻪ ﻫﻮ ﻣﻮﻗﻊ ﻣﻄﻮري أﭘﻞ ﺑﺎﻟﺮاﺑﻂ
ﻋﻠﻰ اﻋﻀﺎء اﻟﻘﺎﺋﻤﺔ اﻟﺒﺮﻳﺪﻳﺔ ،إﻗﺮاء “How To Ask Questions Apple’s developer site at: http://www.
” The Smart Wayاﻟﺘﻲ ﺳﺘﺠﺪﻫﺎ ﺑﺎﻟﺮاﺑﻂ apple.com/developer
http://www.catb.org/~esr/faqs/smart-
ﻧﺤﻦ ﻧﻨﺼﺤﻚ ﺑﺸﺪة ان ﺑﺈرﺗﻴﺎد وﺗﺒﻮﻳﺐ -bookmark-اﻟﻌﻨﺎوﻳﻦ
questions.html اﻟﺘﺎﻟﻴﺔ:
ﻫﻨﺎك ﻋﺪة ﻛﺘﺐ ﻗ ّﻴﻤﺔ ﺣﻮل اﻟﺘﻄﻮﻳﺮ ﺑﺎﺳﺘﺨﺪام .Cocoaو ﻧﺒﺪأ http://osx.hyperjeff.net/reference/
CocoaArticles.php
ﺳﺮدﻧﺎ ﺑﻜﺘﺎب Programming in Objective-C, by Stephen http://www.cocoadev.com
Kochanوﻫﻮ ﻣﻮﺟﻪ ﻟﻠﻤﺒﺘﺪﺋﲔ .وﺑﺠﻌﺒﺘﻨﺎ ﺑﻌﺾ اﻟﻜﺘﺐ اﻟﺘﻲ http://www.cocoabuilder.com
http://www.stepwise.com
ﺗﻔﺘﺮض اﻛﺘﺴﺎﺑﻚ ﳌﻌﺮﻓﺔ ﺑﺮﻣﺠﻴﺔ ﻛﺎﻟﺘﻲ اﺳﺘﻔﺪﻧﺎ ﻣﻨﻬﺎ ﺑﻬﺬا
اﻟﻜﺘﺎب .ﻟﺬا ﻧﻨﺼﺤﻚ ﺑﻜﺘﺎب Cocoa Programming for Mac
اﳌﻮاﻗﻊ اﳌﻮﺿﺤﺔ ﺑﻌﺎﻟﻴﺔ ﲢﺘﻮي رواﺑﻂ ﻣﺘﻨﻮﻋﺔ وﻣﺘﻌﺪدة ﳌﻮاﻗﻊ أﺧﺮى
OS X by Aaron Hillegassواﳌﺆﻟﻒ ﺻﺎﺣﺐ ﻣﺆﺳﺴﺔ Big Nerd
ذات ﻣﺼﺎدر ﻣﻌﻠﻮﻣﺎت ﻣﺘﺸﻌﺒﺔ وﺷﺎﻣﻠﺔ .ﻳﺠﺪر ﺑﻚ ﺗﺴﺠﻴﻞ
Ranchاﻟﺘﻌﻠﻴﻤﻴﺔ ﺣﻴﺚ ﻳﻌﻄﻲ دورات ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﺗﺆﻫﻠﻚ ﻟﻠﻌﻤﻞ ﻋﻀﻮﻳﺘﻚ ﺑﺎﻟﻘﺎﺋﻤﺔ اﻟﺒﺮﻳﺪﻳﺔ اﳋﺎﺻﺔ ﲟﻮﻗﻊ cocoa-devﻋﻠﻰ اﻟﺮﺑﻂ
ﲟﻬﻨﺔ "ﻣﺒﺮﻣﺞ ﻣﺤﺘﺮف" .ﻛﺬﻟﻚ ﻧﻨﺼﺤﻚ ﺑﻜﺘﺎب Cocoa with
http://lists.apple.com/mailman/listinfo/
cocoa-dev
Objective-C by James Duncan Davidson and Appleوﻫﻮ
ذﻟﻚ اﳌﻜﺎن اﻟﺬي ﳝﻜﻨﻚ ﻃﺮح اﺳﺌﻠﺘﻚ ﻓﻴﻪ ﺑﻜﻞ ﺣﺮﻳﺔ .ﺣﻴﺚ
ﻣﻦ اﺻﺪارات . O’Reillyوﻫﻨﺎك ﻛﺘﺎب Cocoa Programming
ﺳﻴﻘﻮم اﻟﻌﺪﻳﺪ ﻣﻦ اﻻﻋﻀﺎء ﺑﺘﻘﺪﱘ ﻳﺪ اﻟﻌﻮن ﺑﻜﻞ ﺣﻔﺎوة وﺗﺮﺣﻴﺐ.
by Scott Anguish, Erick M.Buck, Donald A. Yacktmanوﻫﻮ وﻟﻜﻦ ﻣﻘﺎﺑﻞ ﻫﺬﻩ اﳊﻔﺎوة ﻳﺘﻄﻠﺐ ﻣﻨﻚ اﻟﻘﻴﺎم َ
أوﻻ ﺑﺘﻔﺤﺺ ﻣﺎ
ﻣﻦ إﺻﺪارات SAMSواﻟﻜﺘﺎب دﺳﻢ ﺟﺪاَ ﺑﻜﺒﺮ اﻟﻘﺎﻣﻮس.
ﻳﺤﺘﻮﻳﺔ اﻻرﺷﻴﻒ ﻣﻦ اﺟﻮﺑﺔ ﻗﺪ ﺗﻜﻮن ﺷﺎﻓﻴﺔ ﻻﺳﺘﻔﺴﺎرك أو ﺣ َ
ﻼ
ﳌﺸﻜﻠﺘﻚ ،ان راﺑﻂ اﻻرﺷﻴﻒ ﻫﻮ
١٠٢
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺼﺎدر اﳌﻌﻠﻮﻣﺎت
١٠٣
ﻣﺼﺎدر اﳌﻌﻠﻮﻣﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
١٠٤
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت
١٠٥
ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
١٠٦
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت
ﺟﻬﺎز ﻳ ّﺰود اﳌﺴﺘﺨﺪم ﲟﺆﺷﺮ ﻋﻠﻰ ﺷﺎﺷﺔ ﻋﻤﻮدﻳ َﺎ أو أﻓﻘﻴ َﺎ او اﻻﺛﻨﺎن ﻣﻌﺎً. ﻋﺪد ﻣﻦ اﻟﺘﻮﺟﻴﻬﺎت واﻻواﻣﺮ اﻟﺘﻲ ﻳﻘﻮم
اﳊﺎﺳﺐ ،ﻛﺘﺸﺒﻴﺔ ﻣﺠﺎزي ﻟﻴﺪ اﳌﺴﺘﺨﺪم. ١٧ اﻟﺪاﻻت اﻟﻮﻇﻴﻔﻴﺔ اﳊﺎﺳﺐ ﺑﺘﻨﻔﻴﺬﻫﺎ.
٥٨ اﻟﻘﺎﺋﻤﺔ اﻟﻌﻠﻴﺎ Manu Bar ٧٦ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻹﺟﺮاءات ﺗﺆدي وﻇﻴﻔﺔ ﻣﻌﻴﻨﺔ. اﻟﺒﺮوﺗﻮﻛﻮل
ﻣﺠﻤﻮﻋﺔ اﻹﺟﺮاءات اﳌﺘﺎﺣﺔ ﻟﻠﻤﺴﺘﺨﺪم إﺟﺮاءات ذات ﺻﻴﻐﺔ وﺗﺮﺗﻴﺒﺎت ﻋﻤﻞ ﻣﻮﺣﺪة اﻟﺪوال/اﻟﺪاﻻت اﻟﺒﺮﻣﺠﻴﺔ ١٨ function
ﺣﺴﺐ اﻟﺒﺮﻧﺎﻣﺞ ﻗﻴﺪ اﻟﺘﺸﻐﻴﻞ وﺗﻮﺟﺪ ﺑﺎﳌﺴﺎﺣﺔ ٣٣ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻹﺟﺮاءات ﺗﺆدي وﻇﻴﻔﺔ ﻣﻌﻴﻨﺔ اﻟﺘﺮﺗﻴﺐ اﻻﻓﺘﺮاﺿﻲ
اﻟﻌﻠﻴﺎ ﻣﻦ اﻟﺸﺎﺷﺔ. اﻟﻨﺴﻖ اﳌﻌﺪ او اﻟﻘﻴﻤﺔ اﳌﺴﻨﺪة إﻓﺘﺮاﺿﻴ ًﺎ وﻗﺖ ﻣﻊ إرﺟﺎع ﻗﻴﻤﺔ ﻣﻌﻴﻨﺔ.
٣ اﳌﺎﻛﻨﺘﻮش Macintosh ٩ اﻟﺴﺎﻃﺮة اﻟﺴﻔﻠﻴﺔ ”ـ“ Underscore إﻧﺸﺎء اﻟﻌﻨﺼﺮ أو اﻟﻜﺎﺋﻦ.
ﻧﻈﺎم ﺗﺸﻐﻴﻞ ﺑﺘﻜﻨﻮﻟﻮﺟﻴﺎ ﻣﺘﻄﻮرة ﻳﻌﺘﻤﺪ ١١رﻣﺰ ﺣﺮﻓﻲ ﻣﻦ اﳊﺮوف اﳌﺘﻮﻓﺮة ﺑﻠﻮﺣﺔ اﳌﻔﺎﺗﻴﺢ اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﳌﺘﻐﻴﺮ
ﻣﻜﺘﺒﺎت رﺳﻮﻣﻴﺔ وﻛﺎﺋﻨﺎت ﺑﺮﻣﺠﻴﺔ ﻗﺎﺑﻠﺔ ﻹﻋﺎدة ٥٦ اﻟﺴﺤﺐ واﻻﻓﻼت ﻋﻘﺪ إﺗﻔﺎق ﳊﺠﺰ ﺣﻴﺰ ﻣﻦ اﻟﺬاﻛﺮة ﻳﺪﻋﻰ
اﻻﺳﺘﺨﺪام ﺑﻀﻮاﺑﻂ ﻣﻌﻴﻨﺔ. اﺳﻠﻮب ﺗﻌﺎﻣﻞ ﻓﺮﻳﺪ ﻣﻦ ﻣﻮاﺻﻔﺎت اﻧﻈﻤﺔ ﺑﺎﻟﺘﺼﺮﻳﺢ ﻋﻦ ﻧﻮع واﺳﻢ اﳌﺘﻐﻴﺮ.
٨ اﳌﺘﻐﻴﺮات Variables ٧٧ﺗﺸﻐﻴﻞ أﭘﻞ. اﻟﺘﺼﻔﺢ
ﺣﺎوﻳﺎت ﺗﺨﺰن ﻗﻴﻢ ﺑﺎﻧﻮاع ﻣﻌﻴﻨﺔ ،ﲢﺘﻞ ﺟﺰء ٤١ إﺳﺘﻌﺮاض اﳌﻌﻠﻮﻣﺎت وﻓﻖ ﻣﻈﻬﺮ وﺗﺮﺗﻴﺐ ﻣﻌﲔ .اﻟﺸﺮط اﳌﻨﻄﻘﻲ
ﻣﻦ ذاﻛﺮة اﳋﺎﺳﺐ اﻻﻟﻲ. ٦٣ﻋﻤﻠﻴﺔ إﺳﺘﻴﻔﺎء ﻟﺸﺮط ﺗﻨﺤﺼﺮ ﻋﻤﻠﻴﺎت اﻟﻘﻴﻢ اﻟﺘﻮﺻﻴﻼت
٨ اﳌﺠﻤﻊ compiler ّ ﺣﺠﺰ ﻣﺘﻐﻴﺮات ﻟﻠﻌﻨﺎﺻﺮ ﻣﻦ ﺧﻼل اﻟﺘﻄﺒﻴﻖ IBﻓﻴﻪ ﺑﺼﺤﻴﺢ او ﻏﻴﺮ ﺻﺤﻴﺢ.
ﺑﺮﻧﺎﻣﺞ ﳝﺜﻞ اﳌﺮﺣﻠﺔ اﻟﺘﻲ ﺗﻠﻲ ﺗﻔﺴﻴﺮ اﻟﺸﻔﺮة ٢ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ Code ٣٨ اﻟﺘﻮﻗﻒ اﳌﺆﻗﺖ Braek Point
اﻟﺒﺮﻣﺠﻴﺔ وﺟﻠﺐ اﳌﺼﺎدر اﻟﻼزﻣﺔ ﻟﺘﺤﻮﻳﻠﻬﺎ اﻟﻰ رﻣﻮز وﻣﻔﺮدات اﻟﻠﻐﺔ اﻟﺒﺮﻣﺠﻴﺔ ﺣﻴﺚ ﺗﻜﻮن ﺣﺎﻟﺔ ﻣﻦ اﻟﺘﻮﻗﻒ اﳌﺆﻗﺖ ﻟﺘﻔﺤﺺ ﻣﻌﻄﻴﺎت
ﻟﻐﺔ اﻻﻟﺔ. ﻋﺒﺎرة ﻋﻦ ﻛﺘﻞ ﺗﻌﺮف ﺑﺎﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﻌﻨﺎﺻﺮ اﻟﺒﺮﻣﺠﻴﺔ ﺑﺎﻟﺒﺮﻧﺎﻣﺞ ﻗﻴﺪ اﻟﺘﻔﺤﺺ.
٧ اﳌﺴﺎﺋﻞ اﻟﺒﺮﻣﺠﻴﺔ ٧١اﳌﺴﺘﺨﺪﻣﺔ ﻟﺒﻨﺎء اﻟﺒﺮﻧﺎﻣﺞ. اﳋﻠﻴﺔ
ﻋﻤﻠﻴﺔ ﲢﻮﻳﻞ ﻣﺸﻜﻼت ﺣﺴﺎﺑﻴﺔ وﻣﺘﻄﻠﺒﺎت ٥٠ اﻟﻔﺄرة ﺗﺸﺒﻴﻪ ﻣﺠﺎزي ﻟﻌﺪد ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﳌﻜﺮرة
١٠٧
ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
٥٨اﻟﻜﺎﺋﻦ ،ﺣﺘﻰ ﻳﺘﻌﺎﻣﻞ اﳊﺎﺳﺐ ﻣﻌﻬﺎ ﻳﺠﺐ اﻟﻨﻤﻮذج اﻻب superclass ﻋﻤﻞ وﻣﻬﺎم اﻟﻌﺎﻟﻢ اﳋﺎرﺟﻲ اﻟﻰ ﺻﻴﻎ رﻳﺎﺿﻴﺔ
ﺗﻮﺻﻴﻒ ﻟﻠﻜﺎﺋﻦ اﻟﺒﺮﻣﺠﻲ ﺑﺤﻴﺚ ﻳﺴﺘﻘﻲ ﻣﻨﻪ اﻟﺘﺼﺮﻳﺢ ﻋﻨﻬﺎ ﻟﺘﻮﻓﻴﺮ اﳊﺠﺰ اﳌﻨﺎﺳﺐ ﻣﻦ وﻣﻌﺎدﻻت ﻗﺎﺑﻠﺔ ﻟﻠﺤﻞ ﻣﻦ ﺧﻼل اﳊﺎﺳﺐ.
٩١اﻟﻜﺎﺋﻦ اﻟﻮرﻳﺚ او اﻟﻜﺎﺋﻨﺎت اﻟﻮرﻳﺜﺔ ﻣﺎ ﻳﺤﺘﻮﻳﻪ اﻟﺬاﻛﺮة اﳌﺘﺎﺣﺔ. اﳌﺼﻔﻮﻓﺎت
٤ ﺑﺮﻣﺠﻴﺎت اﻻب ﻣﻦ ﻣﻮاﺻﻔﺎت وإﺟﺮاءات. ﳕﻂ ﻣﻦ اﳌﺘﻐﻴﺮات اﻟﺘﻲ ﺗﺨﺰن ﻗﻴﻢ/ﻛﺎﺋﻨﺎت
اﻟﻨﻤﻮذج اﻟﺘﺼﻨﻴﻔﻲ ٥٢ Class Templateﺑﺮاﻣﺞ ﲢﻘﻖ ﻧﻔﻌﻴﺔ ﻣﻌﻴﻨﺔ دون ان ﺗﻜﻮن ﻣﻦ ﻣﺘﺠﺎﻧﺴﺔ.
ﺿﻤﻦ اﻟﺒﺮاﻣﺞ اﻟﻜﺒﻴﺮة. ١٢ﻣﻮﺻﻔﺎت ﻟﻠﺘﺼﻨﻴﻒ ﺗﺴﺘﺨﺪم ﻛﻨﻤﺎذج اﳌُﻌﺎ ِﻣﻼت اﳊﺴﺎﺑﻴﺔ
٥٠ ﺑﺮﻧﺎﻣﺞ Safari اﻟﻌﻠﻤﻴﺎت اﳊﺴﺎﺑﻴﺔ اﻟﺮﻳﺎﺿﻴﺔ اﻟﺘﻲ ﻳﺘﻢ ﺗﻄﺒﻴﻘﻬﺎ ﻫﻴﻜﻠﻴﺔ ﻟﺒﻨﺎء ﻣﺎ ﻳﻠﻲ ﻣﻦ ﻛﺎﺋﻨﺎت.
٣٨ﺑﺮﻧﺎﻣﺞ أﭘﻞ ﻟﺘﺼﻔﺢ ﻣﻮاﻗﻊ اﻻﻧﺘﺮﻧﺖ. اﻟﻬﻮاﻣﺶ ﻋﻠﻰ اﻻﻋﺪاد.
١ ﺑﺮﻧﺎﻣﺞ Xcode ٥١ﻋﻤﻠﻴﺔ ﺗﺮﺗﻴﺐ وﺗﻨﺴﻴﻖ ﻧﺼﻮص اﻟﺸﻔﺮة اﳌﻨﺼﺔ Dock
واﺟﻬﺔ إﻧﺸﺎء اﻟﺒﺮاﻣﺞ وﲡﻤﻴﻊ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ ﲟﺴﺎﺣﺎت ﻓﺎرﻏﺔ ﻟﺴﻬﻮﻟﺔ اﻟﻘﺮاءة ﺷﺮﻳﻂ ﻳﺤﺘﻔﻆ ﲟﺆﺷﺮات ﻟﻠﺒﺮاﻣﺞ اﻟﺘﻲ
اﻟﺒﺮﻣﺠﻴﺔ ﻣﻦ ﺧﻼل ﻋﺪة ﻟﻐﺎت ﻣﺜﻞ coca, وﺗﻌﻴﲔ اﻟﺘﻌﺸﻴﺶ اﳋﺎص ﺑﻜﻞ داﻟﺔ. ﻳﺴﺘﺨﺪﻣﻬﺎ او ﻳﻌﺘﻤﺪﻫﺎ اﳌﺴﺘﺨﺪم.
carbon,java ٤٠ ٥٦اﻟﻮاﺟﻬﺔ اﻟﺮﺳﻮﻣﻴﺔ ﻟﻠﻨﻈﺎم اﻟﻨﺎﻓﺬ اﻟﺮﺋﻴﺴﺔ
اﻟﺘﺸﺒﻴﻬﺎت اﳌﺠﺎزﻳﺔ ﻟﻠﻌﻨﺎﺻﺮ ﺑﺎﻟﻌﺎﻟﻢ اﳋﺎرﺟﻲ ،ﺗﻘﺼﻲ اﻻﺧﻄﺎء اﻟﺒﺮﻣﺠﻴﺔ ٣٩ debugger اﻟﻨﺎﻓﺬة اﻟﺮﺋﻴﺴﺔ اﻟﺘﻲ ّﲤﺜﻞ ﻛﺎﻓﺔ ﺗﻌﺎﻣﻼت
ﺑﺮﻧﺎﻣﺞ ﻣﺘﺨﺼﺺ ﻟﺘﻔﺤﺺ اﺧﻄﺎء وﻣﻌﻄﻴﺎت داﺧﻞ ﺷﺎﺷﺔ اﳊﺎﺳﺐ ﻣﻦ إزرار وﻧﻮاﻓﺬ اﳌﺴﺘﺨﺪم ﻣﻊ اﻟﺒﺮﻧﺎﻣﺞ ﻗﻴﺪ اﻟﺘﺸﻐﻴﻞ.
وﺳﻴﺮ ﻋﻤﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻗﻴﺪ اﻟﺒﻨﺎء. اﻟﻨﻄﺎق اﶈﻠﻲ ﻟﻠﺪاﻟﺔ ٢٣ variable scopeوﻛﺎﺋﻨﺎت رﺳﻮﻣﻴﺔ.
٦٩ ُ ٢١ﺑﻨﻴﺔ اﻻﺟﺮاء داﻻت ﺗﻌﻴﺪ ﻗﻴﻤﺔ return a value ﻋﻤﻠﻴﺔ ﺣﺠﺐ وﺣﻤﺎﻳﺔ اﺳﻤﺎء اﻟﺘﻐﻴﺮات
ﻛﺘﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻟﺘﻲ ﺗﻮﺻﻒ ﺳﻴﺮ ﻋﻤﻞ وﻣﺤﺘﻮﻳﺎﺗﻬﺎ داﺧﻞ ﻧﻄﺎق اﻟﺪاﻟﺔ دون اﻟﺘﻌﺎرض
٨٣, ٢٠ﻫﺬا اﻻﺟﺮاء. اﻧﻮاع اﻟﺒﻴﺎﻧﺎت ﻣﻊ ﺗﺸﺎﺑﺔ اﻻﺳﻤﺎء ﻓﻲ ﺣﺎل وﺟﺪ ﺧﺎرج
٢٣ ﻟﻠﺒﻴﺎﻧﺎت اﻧﻮاع ﻣﻨﻬﺎ اﻟﻌﺪد وﻣﻨﻬﺎ اﻟﻨﺺ وﻣﻨﻬﺎ ﺑﻨﻴﺔ اﻟﺪاﻟﺔ ﻧﻄﺎﻗﻬﺎ.
١٠٨
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت
١ﺗﻨﻔﺬ وﻓﻖ ﻋﺪد ﻣﻌﲔ ﻣﻦ اﳌﺮات ﺑﻨﺎء ﻋﻠﻰ ﺷﺮط ﺗﻄﺒﻴﻘﺎت اﻧﻈﺮ ﺑﻨﻴﺔ اﻹﺟﺮاء
ﻣﻨﻄﻘﻲ ﻣﺤﺪد ﻣﻦ ﻗﺒﻞ اﳌﺒﺮﻣﺞ. ١٩ﻣﺤﻤﻮﻋﺔ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﺆدي ادوار وﻣﻬﺎم ﺑﻨﻴﺔ ﻏﻴﺮ ﻣﻬﻴﻜﻠﺔ unstructured
ﺣﻠﻘﺔ اﻟﺘﻜﺮار ٩٤ ,٤٧ ,٤٦ for-loop ﺑﺮﻣﺠﻴﺔ ﺑﺮﻧﺎﻣﺞ ﻣﻜﻮن ﻣﻦ ﻋﺪد ﻣﻦ اﳌﻜﻮﻧﺎت اﻟﻐﻴﺮ
٥٨ﻛﺘﻠﺔ ﻣﺤﺘﻮﻳﺔ ﻟﻌﺪد ﻣﻦ اﻹﺟﺮاءات ،واﻟﺘﻲ ﺗﻨﻔﺬ ﺗﻌﺎودﻳﺔ ﻣﺮﺗﺒﺔ ﺑﺸﻜﻞ ﻣﻨﻄﻘﻲ.
وﻓﻖ ﻋﺪد ﻣﻌﲔ ﻣﻦ اﳌﺮات. ٥٤, ٣٨إﺳﺘﺪﻋﺎء اﻹﺟﺮاء ﻟﺬاﺗﻪ ﺿﻤﻦ إﺟﺮاءاﺗﻪ ﺗﺮوﻳﺴﺎت headers
٥٦ ﺧﺼﺎﺋﺺ proprity اﻟﺪاﺧﻠﻴﺔ. اﻧﻈﺮ
٥٦ﻗﻴﻢ ﻣﻜﻨﻮﻧﺎت وﺧﺼﺎﺋﺺ اﻟﻌﻨﺼﺮ اﻟﺒﺮﻣﺠﻲ أو ﺗﻌﻠﻴﻖ ﻣﻘﺘﻀﺐ ﺗﺮوﻳﺴﺔ اﻟﺘﻄﺒﻴﻘﺎت
اﻟﻜﺎﺋﻦ. ﳕﺎذج ﻣﺒﻴﺘﻪ ﻣﻦ اﳌﺼﺎدر واﻟﻜﺘﻞ اﻟﺒﺮﻣﺠﻴﺔ وﻫﻲ ﺗﻔﺴﻴﺮ ﻣﺨﺘﺼﺮ دون اﻟﺘﻌﻤﻖ ﻟﺸﺮح اﻟﻔﻜﺮة.
٤٦ ﺧﻄﻮات اﻟﺰﻳﺎدة ”“steps ٢٢ ﺗﻔﺴﻴﺮ ﺟﺎﻫﺰة ﻟﻺﺳﺘﺨﺪام اﻟﻔﻮري.
١٨ ﻋﻤﻠﻴﺔ ﺗﻘﻴﻴﻢ ﻣﻔﺮدات اﻻﺟﺮاءات اﻟﺒﺮﻣﺠﻴﺔ ﻓﻮر داﻟﺔ )(main ٧١ ﺗﺼﺮﻳﺤﺎت
اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﺔ ﺑﺸﻔﺮة اﻟﺒﺮﻣﺠﺔ ﻋﻨﺪ ﺗﺸﻐﻴﻞ اي ﻋﻘﺪ اﺗﻔﺎق ﻣﻊ اﳊﺎﺳﺐ ﳊﺠﺰ ﺣﻴﺰ ﻣﻦ اﻟﺬاﻛﺮة ﺗﻠﻘﻴﻬﺎ ،وﻫﻲ ﻋﻤﻠﻴﺔ ﺑﻄﻴﺌﺔ ﻧﺴﺒﻴﺎً.
٥٨ﺑﺮﻧﺎﻣﺞ. ﺗﻜﻴﻴﻒ override ﻣﺼﺮح ﻋﻨﻪ.ﳌﺘﻐﻴﺮ أو ﻛﺎﺋﻦ ّ
٣٣ ﺳﻄﺮ اﻻواﻣﺮCommand Line ٥٧ ,٥١ﺗﻐﻴﺮ ﻃﻔﻴﻒ ﻓﻲ أداء ﻋﻤﻞ ﻣﺼﻨﻒ او إﺟﺮاء ﺗﺼﻨﻴﻒ Class
٥٨ ﺳﻼﻟﺔ اﻟﺘﺼﻨﻴﻒ ﺑﺎﻟﺒﺮﻧﺎﻣﺞ ﻛﺎﺋﻦ ﺑﺮﻣﺠﻲ ﻣﻦ ﺳﻼﻟﺔ ﻣﻌﻴﻨﺔ ﺑﻌﺪد ﻣﻦ
٥٢ﻧﻮع اﻟﺴﻼﻟﺔ اﻟﺘﻲ ﻳﺮث ﻣﻨﻬﺎ اﻟﻜﺎﺋﻦ ﺻﻔﺎﺗﻪ. ﺣﻘﻞ ﻧﺺ text field اﻟﺘﻮﺻﻴﻔﺎت واﻻﺟﺮاءات واﻟﻮﻇﺎﺋﻒ اﳌﻔﻴﺪة.
٢٦ ﺗﺸﺒﻴﺔ رﺳﻮﻣﻲ ﻣﺠﺎزي ﻟﻠﺤﻘﻞ اﳌﺘﺎح ﻹﺳﺘﻘﺒﺎل ﺳﻠﺴﺔ اﳊﺮوف string ﺗﺼﻨﻴﻒ اﻋﻠﻰ٥٧Root Class/Super Class
ﺳﻠﺴﻠﺔ اﳊﺮوف اﳌﻜﻮﻧﺔ ﻟﻠﻨﺼﻮص ،ﺣﻴﺚ ﻳﺘﻢ ادﺧﺎﻻت اﳌﺴﺘﺨﺪم ﻣﻦ اﻟﻨﺼﻮص. اﻻب اﳌ ّﻮرث ﻓﻲ ﺳﻠﺴﻠﺔ اﻟﻮراﺛﺔ
٤٧اﻻﺷﺎرة ﶈﺘﻮﻳﺎﺗﻬﺎ ﻣﻦ ﺣﺮوف وﻛﻠﻤﺎت. ﺣﻠﻘﺔ )( do {} while ٥٨ ﺗﺼﻨﻴﻒ ﻣﺘﺤﺪر sub-Class
٨٣ ,٥٧ ﺳﻠﺴﻠﺔ اﻟﺘﻮارث /اﻟﻮراﺛﺔ ﻛﺘﻠﺔ ﻣﺤﺘﻮﻳﺔ ﻟﻌﺪد ﻣﻦ اﻹﺟﺮاءات ،واﻟﺘﻲ اﻻﺑﻦ اﳌﺘﺤﺪر ﻣﻦ ﺳﻠﺴﻠﺔ اﻟﻮراﺛﺔ.
١٠٩
ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
١١٠
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﺴﺮد اﳌﺼﻄﻠﺤﺎت
ﻋﻠﻰ إﺟﺮاءات وﻣﻌﺎﻣﻼت ﺗُﺪﺧﻞ ﻳﺪوﻳﺎً ،ﻫﺬﻩ ١٩ﻧﻄﺎق اﻟﺪاﻟﺔ ﺑﻌﻴﻨﻬﺎ. ﻣﻌﺸﺶ Nesting
اﻟﻮاﺟﻬﺔ ﺗﺴﺘﺨﺪم اﻟﻨﺼﻮص ﻓﻘﻂ. ١ ﻧﻈﺎم Mac OS X ﺗﻌﺸﻴﺶ ،ﲟﻌﻨﻰ ﺗﻀﻤﲔ ﻋﻤﻠﻴﺎت إﺟﻮاﺋﻴﺔ،
٣ وﻧﺪوز Windows ﻧﻈﺎم ﺗﺸﻐﻴﻞ ﺣﺪﻳﺚ ﻣﻜﻮن ﻣﻦ ﻋﺪة داﺧﻞ ﻋﻤﻠﻴﺎت إﺟﺮاﺋﻴﺔأﺧﺮى.
ﻧﻈﺎم ﺗﺸﻐﻴﻞ رﺳﻮﻣﻲ ﻣ ّﻌﺪ ﻣﻦ ﻗﺒﻞ ٥٦ﻣﻜﻮﻧﺎت ﻻﻧﻈﻤﺔ ﺗﺸﻐﻴﻞ اﻫﻤﻬﺎ ﻧﻈﺎم ،BSD ﻣﻼﻣﺢ Attributes
ﻣﺎﻳﻜﺮوﺳﻮﻓﺖ وﺗﻜﻨﻮﻟﻮﺟﻴﺎ اﺑﻞ ﻣﻦ ﻣﻜﺘﺒﺎت cocoaو car- اﻟﺴﻤﺎت اﻟﺘﻲ ﲢﺪد ﻫﻴﺌﺔ اﻟﻌﻨﺎﺻﺮ اﻟﺒﺮﻣﺠﻴﺔ
bonوﻣﺪﻳﺮ اﳌﻜﻮﻧﺎت اﻟﺮﺳﻮﻣﻴﺔ .quartz ﺑﺼﺮﻳﺎً.
٢٠ ٦١ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻌﺎﺋﺪ ﻣﻨﻔﺬ ﺧﺮج Output Port
اﻧﻈﺮ ﻧﻮع - Typeﺣﻴﺚ ﺗﺸﺘﺮط ﺑﻌﺾ اﻟﺪوال ﻣﺼﺪر ﻟﺘﻠﻘﻲ ﻣﺨﺮﺟﺎت ﻋﻤﻠﻴﺎت اﳊﺎﺳﺐ
إﺳﺘﺮﺟﺎع ﻗﻴﻤﺔ ﻣﻦ ﻧﻮع ﻣﻌﲔ. اﻻﻟﻲ.
١٩ ﻫﻴﻜﻠﺔ structure ١ ﻣﻮﻗﻊ أﭘﻞ اﻻﻟﻜﺘﺮوﻧﻲ
ﻣﻮﻗﻊ اﻟﺸﺮﻛﺔ اﻻم ﺣﻴﺚ ﻳﺘﻢ ﺗﺰوﻳﺪك ﺑﺎﳌﺼﺎدر ﻧﻈﺎم ﺑﻨﻴﻮي ﻣﺮﺗﺐ ﻟﺘﻜﻮﻳﻦ ﺑﻨﻴﺔ اﻟﺒﺮﻧﺎﻣﺞ
واﻟﺘﻌﻠﻴﻤﺎت اﳌﺘﻌﻠﻘﺔ ﺑﺎﻟﻨﻈﺎم واﺳﺎﻟﻴﺐ ﺑﺮﻣﺠﺘﻪ .ﻣﻨﻄﻘﻴ َﺎ ﺣﺘﻰ ﻳﺴﻬﻞ ﺗﻄﻮﻳﺮة وزﻳﺎدة ﻗﺪراﺗﻪ.
١ ٥٠واﺟﻬﺔ اﻟﺘﻄﺒﻴﻘﺎت اﻟﺮﺳﻮﻣﻴﺔ ﻧﺎﻓﺬة
واﺟﻬﺔ ﺗﻌﺎﻣﻞ رﺳﻮﻣﻴﺔ ﻣﻊ اﳊﺎﺳﺐ اﻻﻟﻲ، ﻋﻨﺼﺮ ﺑﺮﻣﺠﻲ ﻳﺆدي دور اﺣﺘﻮاء وﻋﺮض
ﺗﺴﺘﻨﺪ ﻓﻲ إﺟﺮاءاﺗﻬﺎ وﻣﻌﺎﻣﻼﺗﻬﺎ ﻋﻠﻰاﻟﺘﻌﺎﻣﻞ ﻋﻨﺎﺻﺮ ﺑﺮﻣﺠﻴﺔ ﻛﺘﺸﺒﻴﻪ ﻣﺠﺎزي ﻟﻠﺤﺎوﻳﺔ.
٣٦اﻟﺘﺸﺒﻴﻬﻲ ﻟﻠﻌﻨﺎﺻﺮ ﻣﻦ ازرار وﻧﻮاﻓﺬ ،ﻫﺬﻩ ﻧﺎﻓﺬة اﻟﺘﻮﺛﻴﻖ Run Log window
اﻟﻮاﺟﻬﺔ ﺗﺴﺘﺨﺪم اﻟﻨﺼﻮص واﻟﺮﺳﻮﻣﺎت. ﻧﺎﻓﺬة ﻟﻌﺮض ﻣﺨﺮﺟﺎت ﻋﻨﺎﺻﺮ اﻟﺒﺮﻧﺎﻣﺞ.
٣٢ وﺣﺪة ﻃﺮﻓﻴﺔ Terminal ٢٣ ,٢٠ ﻧﻄﺎق اﻟﺪاﻟﺔ
ﻣﺤﺪد ﻻﺳﻤﺎء اﳌﺘﻐﻴﺮات اﻟﺘﻲ ﺗﻨﺤﺼﺮ داﺧﻞ واﺟﻬﺔ ﺗﻌﺎﻣﻞ ﻣﻊ اﳊﺎﺳﺐ اﻻﻟﻲ ،ﺗﺴﺘﻨﺪ
١١١
ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode ﻣﻼﺣﻈﺎت اﳌﺘﺮﺟﻢ
ﻣﻼﺣﻈﺎت اﳌﺘﺮﺟﻢ
ﻟﻘﺪ ﺣﺮﺻﺖ ﻛﻞ اﳊﺮص ان اﻗﻮم ﺑﻨﻘﻞ اﳌﻌﻠﻮﻣﺎت اﻟﻮاردة ﺑﻬﺬا
اﻟﻜﺘﺎب BECOME AN XCODERﺑﻜﻞ دﻗﺔ واﻣﺎﻧﺔ ﻣﻊ ﻣﺮاﻋﺎة
ﻗﻮاﻋﺪ اﻟﻠﻐﺔ اﻟﻌﺮﺑﻴﺔ ،وﻧﻈﺮاَ ﻻﺧﺘﻼف ﻃﺒﻴﻌﺔ ﺑﻌﺾ اﳌﺴﻤﻴﺎت اﻟﺘﻲ ﻟﻢ
ﻳﺄت ﻓﻴﻬﺎ اﻻﺗﻔﺎق ﻋﻨﺪﻣﺎ ﻳﺨﺘﺺ اﻻﻣﺮ ﺑﺎﻟﺒﺮﻣﺠﺔ اﳊﺪﻳﺜﺔ ﻛﺈﺳﺘﺨﺪام
اﻟﻜﺎﺋﻨﺎت ﺣﻴﺚ ﻳﺸﻴﺮ اﻟﺒﻌﺾ اﻟﻴﻬﺎ ﺑﺎﻟﺒﺮﻣﺠﺔ ﻏﺮﺿﻴﺔ اﻟﺘﻮﺟﺔ ،وﻫﻨﺎك
ﻓﺮﻳﻖ ﻳﺮى اﻧﻬﺎ اﻟﺒﺮﻣﺠﺔ ﺑﺎﻷﺷﻴﺎء ﻟﺪا اﻋﺘﻤﺪت اﻹﺷﺎرة اﻟﻰ ﻛﻞ ﻣﺎ
ﻳﺘﻌﻠﻖ ﺑﻬﺬا اﻟﻘﻄﺎع اﳉﺪﻳﺪ ﻣﻦ اﻟﺒﺮﻣﺠﺔ ﺑﺎﻟﻜﺎﺋﻨﺎت وﻣﺎ ﻳﻨﺪرج ﲢﺘﻬﺎ
ﻣﻦ ﻣﺼﻨﻔﺎت وﻣﺴﺘﻨﺴﺨﺎت ،وﻣﺆﺷﺮات pointersﻧﺎﺋﺒﺔ ،ﻹﻧﺎﺑﺘﻬﺎ
ﻋﻦ اﻟﻜﺎﺋﻦ اﳊﻘﻴﻘﻲ أﺛﻨﺎء اﻟﺘﻌﺎﻣﻞ واﻟﺘﺪاول .ﻟﺬا ﻗﺪ ﻳﻈﻬﺮ ﻟﻠﺴﻄﺢ
ازدواﺟﻴﺔ ﻓﻲ اﺳﺘﺨﺪام ﺑﻌﺾ اﳌﻔﺮدات اﻟﺘﻘﻨﻴﺔ ،واﻟﺘﻲ ﻗﺪ ﻳﻌﺘﺎد ﻣﻦ
ﻫﻢ ﺑﺤﻘﻞ اﻟﺒﺮﻣﺠﺔ ﻋﻠﻴﻬﺎ ﻣﻦ ﺗﺴﻤﻴﺎت ﻣ ّﻌﺮﺑﺔ ﻛﻜﻠﻤﺔ Classﺣﻴﺚ
اﻋﺘﻤﺪﺗﻬﺎ ﺑﻜﻠﻤﺔ "ﺗﺼﻨﻴﻒ" ﻓﻲ ﻫﺬا اﻟﻜﺘﺎب رﻏﻢ ان ﺑﻌﺾ اﳌﺮاﺟﻊ
ﺗﺮاﻫﺎ "ﻛﻄﺒﻘﺔ" .ﻛﺬﻟﻚ اﻋﺘﻤﺪت ﻛﻠﻤﺔ إﺟﺮاء وداﻟﺔ ﻟﻺﺷﺎرة اﻟﻰ
ﻛﻞ ﻣﻦ Method,Actionو ،functionو ﻟﻢ اﻣﺘﻨﻊ ﻋﻦ ﺳﺮد ﻫﺬﻩ
اﳌﺼﻄﻠﺤﺎت ﻣﻊ ﻣﺘﺮادﻓﺎﺗﻬﺎ اﻟﻼﺗﻴﻨﻴﺔ ،وﻗﺪ اﺷﻴﺮ اﻟﻴﻬﺎ ﺑﻄﺮﻳﻘﺔ او
أﺧﺮى ،وﻓﻲ ﺣﺎل اﺧﺘﻼل اﳌﻌﻨﻰ ﻳﻜﻮن اﳊﻞ ﲟﺴﺮد اﳌﺼﻄﻠﺤﺎت.
١١٣
ﻣﻼﺣﻈﺎت اﳌﺘﺮﺟﻢ ﻧﺤﻮ اﻟﺒﺮﻣﺠﺔ ﺑـ Xcode
ﻓﻘﺪ اﻋﺘﻤﺪﺗﻬﺎ ﲟﻘﺎس ١٢ﻧﻘﻄﺔ ﺑﻨﺴﺒﺔ ٪٥٠ﻣﻦ اﻻﺳﻮد ﺣﻮل ﻫﺬا اﻟﻌﻤﻞ
ﺑﺎﻟﻜﺘﺎب ،اﻣﺎ اﳋﻂ اﻟﻼﺗﻴﻨﻲ اﳌﺴﺘﺨﺪم ﻫﻮ )Palatino (T1 اﻟﺒﺮﻣﺠﺔ ﻣﻦ وﺟﻬﺔ ﻧﻈﺮي ﻧﻮع ﻣﻦ اﻧﻮاع اﻟﻬﻮاﻳﺎت اﻟﺘﻲ
ﻣﻘﺎس ١٢ﻧﻘﻄﺔ ﻛﺒﻨﻂ اﻧﺴﺐ ،اﻣﺎ ﻟﻨﻤﻂ ﺧﻄﻮط اﻟﺸﻔﺮة اﻣﻀﻴﺖ ﻣﻌﻬﺎ ﻓﺘﺮة ﺗﺘﺠﺎوز اﻟﻌﺸﺮة ﺳﻨﻮات واﻧﺎ اراﻗﺐ
اﻟﺒﺮﻣﺠﻴﺔ ﻓﻘﺪ رأﻳﺖ ان اﳋﻂ Courier Newﻣﻘﺎس ١٢ ﺗﻄﻮرﻫﺎ وﲢﺴﻨﻬﺎ دون ﻣﺸﺎرﻛﺔ ﻓﻌﻠﻴﺔ ﻣﻨﻲ ﺑﺘﻄﻮﻳﺮ ﻣﺎ
ﻫﻮ اﻻﻧﺴﺐ ،وﻗﺪ اﻋﺘﻤﺪت ﻣﻘﺎس ﺻﻔﺤﺎت A4ﻣﻨﺎﺳﺐ ﳝﻜﻦ ان ﻳﻜﻮن ﺑﺮاﻣﺞ ﻋﺮﺑﻴﺔ ذات ﻣﻘﺎﻳﻴﺲ ﻣﻮﺣﺪة ،وﻗﻴﻤﺔ
ﻟﻠﻘﺮاءة ﻣﻦ ﺧﻼل ﺷﺎﺷﺔ اﳊﺎﺳﺐ او ﻋﻨﺪ ﻃﺒﺎﻋﺔ اﶈﺘﻮى ﻣﻨﻔﻌﻴﺔ ﺟﻤﺔ ﳌﻦ ﻳﺴﺘﺨﺪم ﺗﻠﻚ اﻟﺒﺮاﻣﺞ.
ﻋﻠﻰ اﻻوراق ﺑﻮﺿﻌﻴﺔ اﻓﻘﻴﺔ ﻣﻌﺮوﻓﻪ ﺑﺎﺳﻢ .landscape
ﺑﺎﻟﺼﺪﻓﺔ اﺛﻨﺎء ﲡﻮﻟﻲ ﺑﺎﺣﺪ اﳌﻮاﻗﻊ ،وﺟﺪت ﻫﺬا اﻟﻜﺘﺎب
ﻛﺎﻓﺔ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ اﳌﺴﺘﺨﺪﻣﺔ ﺑﺎﻟﻜﺘﺎب ﺗﻮﺟﺪ ﲟﻠﻒ اﻟﻘﻴﻢ ،وﻫﻮ دﻋﻮة ﻟﻨﺸﺮ ﺛﻘﺎﻓﺔ ووﻋﻲ ﺟﻴﻞ ﺟﺪﻳﺪ ﻣﻦ
ﻣﻨﻔﺮد اﺳﻤﻪ BECOME AN XCODER - source code. اﳌﺒﺮﻣﺠﲔ ،وﻗﺪ رأﻳﺖ اﻧﻬﺎ ﻓﺮﺻﺔ ﺳﺎﻧﺤﺔ ﻻﺛﺒﺎت ﻣﺪى
txtوﻫﻮ ﻳﺤﺘﻮي ﻣﺎورد ﻣﻦ أﻛﻮاد ﺣﺴﺐ ﻛﻞ ﻓﺼﻞ. ﻓﻬﻤﻲ ﻣﻦ ﺧﻼل ﺗﺮﺟﻤﺔ ﻣﺎ ﻳﺤﺘﻮﻳﺔ اﻟﻜﺘﺎب ،ﻣﺆﻟﻔﻴﻪ
ﻟﻘﺪ ﰎ اﻟﺒﺪأ ﺑﻬﺬا اﻟﻌﻤﻞ واﻻﻧﺘﻬﺎء ﻣﻨﻪ ﺧﻼل ﺷﻬﺮ وﻧﻴﻒ اﻻﺻﻠﻴﲔ ﻳﺸﺠﻌﻮن اﳉﻤﻴﻊ ﻋﻠﻰ ﻗﺮاءﺗﻪ وﺗﺪاوﻟﻪ وﻫﻮ
ﻣﻦ اﻟﻌﺎم ،٢٠٠٦وﻫﻮ ﻣﺠﻬﻮد ﻓﺮدي -ﻓﻼ ﺗﺒﺨﻞ ﻋﻠﻰ ﺑﺎﻟﻔﻌﻞ ذي ﻗﻴﻤﺔ ﻋﺎﻟﻴﺔ.
ﺑﺎﻟﺘﺼﻮﻳﺐ -آﻣﻞ ان ﺗﺴﺘﻤﻊ ﺑﻘﺮاءﺗﺔ واﻻﺳﺘﻔﺎدة ﻣﻨﻪ ﻛﻤﺎ
ﻟﻘﺪ اﻋﺘﻤﺪت ﻓﻲ ﺗﻨﺴﻴﻖ ﻫﺬا اﻟﻜﺘﺎب ﳕﻂ ﻣﻮﺣﺪ ﻣﻦ
اﺳﺘﻤﺘﻌﺖ واﺳﺘﻔﺪت ﻣﻨﻪ.
اﳋﻄﻮط وﻫﻮ ﺧﻂ اﻟﺒﻴﺎن Al Bayanاﳌﺰود ﺑﺎﻟﻨﻈﺎم وﻫﻮ
ﻣﺎزن اﻟﺮﻣﺎل ﻣﺴﺘﺨﺪم ﻟﻠﻨﺼﻮص اﻟﺪاﺧﻠﻴﺔ ﲟﻘﺎس ﻣﻘﺪارﻩ ١٨ﻧﻘﻄﺔ وﻫﻮ
ﺟﺪة ٢٠٠٦ - ذاﺗﻪ اﳌﺴﺘﺨﺪم ﻟﻠﺘﺒﻮﻳﺐ واﻟﺘﺮوﻳﺴﺎت اﻟﻌﻠﻮﻳﺔ ) ١٣ﻧﻘﻄﺔ(
واﻟﻌﻨﺎوﻳﻦ اﻟﺮﺋﻴﺴﺔ ) ٣٦ﻧﻘﻄﺔ( ،اﻣﺎ اﻟﻌﻨﺎوﻳﻦ اﻟﻔﺮﻋﻴﺔ )ﳕﻂ
ﻋﺮﻳﺾ( ﻓﻬﻲ ذاﺗﻬﺎ اﳌﺴﺘﺨﺪﻣﺔ ﻟ ُﺒﻨﻴﺔ اﻟﻨﺺ اﻣﺎ اﻟﺘﻨﻮﻳﻬﺎت
١١٤