æ¬ãã£ã¬ã³ãžã¯ã Fat View Controller ãšããŠå®è£ ããããªããŒã·ã¢ããªããªãã¡ã¯ã¿ãªã³ã°ããã©ãã ãã¯ãªãŒã³ãªèšèšãšã³ãŒããå®çŸã§ããããšããã³ã³ããã£ã·ã§ã³ã§ãïŒãžã£ããžãåªå£ãå€å®ããããã§ã¯ãªããèšèšã®æã競ãåãã®ãç®çã§ãïŒã
Fat View Controller 㯠iOS ã¢ããªéçºã«ãããã¢ã³ããã¿ãŒã³ãšããŠããç¥ãããŠããŸãã Fat View Contoller ãäœããšã UI ãšããžãã¯ãåé¢ããããã¢ãžã¥ãŒã«æ§ãäœãããã¹ããã¥ããã³ãŒããã§ãããããŸããç¶æ 管çãè€éã«ãªããä¿®æ£æã®åœ±é¿ç¯å²ãèŠéãã¥ãããã¡ã³ããã³ã¹æ§ãäœäžããŸãã
è©Šè¡é¯èª€ã®çµæãèªåãªãã« Fat View Controller ãšã®æŠãæ¹ã確ç«ãã人ãå€ãã§ããããå匷äŒãã«ã³ãã¡ã¬ã³ã¹ãªã©ã§ç¥èŠãå ±æããããšã§ãã³ãã¥ããã£ãšããŠã®æŠãæ¹ãé²åããŠããŸããããŸãããã®ãããªåé¡ã¯ iOS ã¢ããªã«éã£ã話ã§ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠããã¯ãªãŒã³ãªèšèšã»ã³ãŒããå®çŸããããã«ãæ§ã ãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãèæ¡ãããŠããŸãããããã«ããããããµããŒããããã¬ãŒã ã¯ãŒã¯ãå€æ°éçºãããŠããŸãã
ãããããã®ãããªæŠãæ¹ã¯æœè±¡çãªèª¬æã§ã¯ãªããªãäŒãããŸãããå ·äœçãªèª¬æããããªã¥ãŒã ã®é¢ä¿ã§æ¥µåºŠã«åçŽåãããäŸã«ãªã£ãŠããŸããã¡ã§ãããã®ãããå®éã®ãããžã§ã¯ãã«é©çšããããšããŠãã説æã®æå³éãã«é©çšã§ããŠããã®ãããããªããšããã±ãŒã¹ãå€ãã®ã§ã¯ãªãã§ãããããäžæ¹ã§ãããçŸå®çãªäŸã§èª¬æããããšããŠããæ¥åã§æ±ããããªå·šå€§ã§è€éãªã³ãŒãããŒã¹ã¯ã説æã®é¡æã«ã¯äžé©åã§ããæŠãæ¹ãç解ããåã«ãã³ãŒãã®æåãç解ããã ãã§å€å€§ãªæéãå¿ èŠãšããŸãã
ãããé©åãªè€éããšããªã¥ãŒã ãæã£ãé¡æãããã°ã Fat View Controller ãšã®æŠãæ¹ãããå ·äœçãªåœ¢ã§åŠã¹ãã¯ãã§ãããŸããå ±éã®é¡æãçšããŠæ¯èŒããã°ãã©ã®æ¹æ³ãäœãã©ã®ããã«è§£æ±ºããã®ãããŸãäœãã«ããŒããŠã ãªã ã®ããå¯èŠåããè«ãããããªããŸãã
ããã§ã誰ããä»æ§ãç¥ã£ãŠããããã€ãé©åºŠãªè€éããæã£ã察象ãšããŠããªããŒã·ïŒãªã»ããšãåŒã°ããŸããããªã»ãã¯ã¡ã¬ããŠã¹ç€Ÿã®ç»é²åæšã®ãããããã§ã¯ãªããŒã·ãšåŒã³ãŸãïŒãéžã³ãŸããããã®ã³ã³ããã£ã·ã§ã³ã§ã¯ãçšæããã Fat View Controller ãã©ãã ãã¯ãªãŒã³ã«ãªãã¡ã¯ã¿ãªã³ã°ã§ãããã競ããŸãã
ãããããã® Fat View Controller ã®ã³ãŒãã¯ãã©ããããããªãã¹ãã²ããã£ã³ãŒããªããã§ã¯ãããŸããã UI ãšããžãã¯ãåé¢ãããŠããªããšããåé¡ããããŸãããã³ãŒãèªäœã¯ãããªãã«æŽçãããŠããŸããäžæã« Fat View Controller ã解æ¶ããããšãããšãäžå¿ èŠã«ã³ãŒããè€éåããŠããŸãã§ãããããããªããªãããã«è ãåãããŸããæ¯éãããªãã®æãé§äœ¿ããŠãçæ³ã®èšèšãšã³ãŒããå®çŸããŠäžããïŒ
ãªããŒã·ã¯ã次ã®ç¹ã§é¡æãšããŠåªããŠãããšèããŠããŸãã
- 誰ããã«ãŒã«ãç¥ã£ãŠããã®ã§ä»æ§ã®ç解ã容æã§ãã
- ã²ãŒã èªäœã«æäœé以äžã®è€éãããããèšè¿°ãã¹ãå ·äœçãªããžãã¯ãååšããïŒã©ã®ãã£ã¹ã¯ãè£è¿ãããªã©ïŒ
- æ確ã«ãã¹ããã¹ãäºé ïŒã²ãŒã ã®ã«ãŒã«ãæºãããŠãããïŒãååšãã
- ããªã¥ãŒã ã倧ããããªãïŒçç·Žãããšã³ãžãã¢ãæ°æéã 1 æ¥çšåºŠããã°æ±ããïŒ
ãŸããäžè¬çãªã¢ããªéçºã«ãããŠåé¡ãšãªããããäºé ãæ±ããããã«ãæ¬ã¢ããªã®ä»æ§ãšããŠæ¬¡ã®ãããªç¹åŸŽãåããŠããŸãã
- éåæåŠçã䌎ãïŒãã£ã¹ã¯ãè£è¿ãã¢ãã¡ãŒã·ã§ã³ã AI ã®æèãªã©ïŒ
- æ°žç¶åã®ããã® I/O ã䌎ãïŒã²ãŒã éäžã§ããã»ã¹ãçµäºãããŠãåéã§ããããã«ïŒ
- ã€ã³ã¿ã©ã¯ã·ã§ã³ãšãããã«äŒŽã UI ã®å¶åŸ¡ãå¿ èŠã§ãã
æ¬ãªããžããªã clone ãã Xcode 㧠Reversi.xcodeproj ãéããŠäžãããæ¬ã¢ããªã¯ Fat View Controller ãšããŠå®è£
ãããŠãããäžéšã®ãã¥ãŒã³ã³ããŒãã³ããåºæ¬çãªããŒã¿åãé€ããŠããã¹ãŠã®ã³ãŒãã ViewController.swift ã«æžãããŠããŸãããã® ViewController
ã¯ã©ã¹ã«æžãããã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããã®ããã£ã¬ã³ãžã®å
容ã§ãã
ãªãã¡ã¯ã¿ãªã³ã°ãªã®ã§ã ã¢ããªã®æåãå€åããªãããã«ããŠäžãã ãæåãç¶æãããŸãŸãã©ãã ãã³ãŒããã¯ãªãŒã³ã«ã§ããããšãããã£ã¬ã³ãžã§ãããªãããªãã¡ã¯ã¿ãªã³ã°ãšããã¿ãŒã ã¯ãããã§ã¯æåãå€æŽããã«ã³ãŒããå€æŽãããšããæå³ã§äœ¿ã£ãŠããŸããéåžžãªãã¡ã¯ã¿ãªã³ã°ã«æ±ãããããããªæ®µéçãªä¿®æ£ãæåŸ ããŠããããã§ã¯ãããŸãããä»æ§ãç解ããäžã§çæ³çãªèšèšãèããã»ãŒã¹ã¯ã©ããã§åå®è£ ãããããªå€§èãªå€æŽãåé¡ãããŸããããã¡ãããéåžžã®ãªãã¡ã¯ã¿ãªã³ã°ãšåãããã«ã段éçã«ä¿®æ£ãè¡ã£ãŠãæ§ããŸããã
ãªãã ViewController.swift 以å€ã®ã³ãŒãïŒãªããŒã·ã®ç€ããã£ã¹ã¯ã衚瀺ãããã¥ãŒã³ã³ããŒãã³ãããã£ã¹ã¯ã®è£è¡šãè¡šãããŒã¿åïŒã¯å€æŽãå ããã«ãã®ãŸãŸå©çšã§ããããã«äœãããŠããŸããããšãã°ããã£ã¹ã¯ãè£è¿ãã¢ãã¡ãŒã·ã§ã³ã¯ CellView
ãšãããã䞊ã¹ãŠä¿æãã BoardView
ã«å®è£
ãããŠãããèªåã§å®è£
ããå¿
èŠã¯ãããŸããããŸãã Storyboard ããã®ãŸãŸå©çšããããšãã§ããŸãããã ãããããã®å©çšã¯åŒ·å¶ãããããã§ã¯ãªãããŸããä¿®æ£ãçŠæ¢ãããŠããããã§ã¯ãããŸãããããšãã°ãæ¢åã³ãŒã㯠UIKit ããŒã¹ã§å®è£
ãããŠããŸãããïŒæåããç¶æã§ãããªãïŒ SwiftUI ã§åå®è£
ããŠãåé¡ãããŸããã
ãªããŒã·ã¯æ確ãªã«ãŒã«ãæã£ãã²ãŒã ã§ããã«ãŒã«ãæ£ããå®è£ ã§ããŠãããåäœãã¹ãã§æ€èšŒã§ããããšãæãŸããã§ããçŸç¶ã§ã¯ããã£ã¹ã¯ã眮ããŠãã£ã¹ã¯ãè£è¿ãåŠçãšã¢ãã¡ãŒã·ã§ã³ã®å¶åŸ¡ããã¥ãŒã®æŽæ°ïŒãã£ã¹ã¯ã®ææ°ã®è¡šç€ºïŒãªã©ãé¢é£ãåã£ãŠããããªããŒã·ã®ããžãã¯ã ããåäœãã¹ãããã®ãå°é£ã§ãããªããŒã·ã®ããžãã¯ãåãé¢ããŠãåäœãã¹ãã§ããããã«ããŸãããã
ããã«ããªããŒã·ãšããã²ãŒã èªäœãæã€ããžãã¯ãšã¯å¥ã«ãã¢ããªã±ãŒã·ã§ã³ã«çŽä»ããããžãã¯ãååšããŸããããšãã°ã "Manual" ã®ïŒäººéãæäœããïŒãã¬ã€ã€ãŒã¯ BoardView
ã®ã»ã«ãã¿ããããããšã§ãã£ã¹ã¯ãé
眮ããŸããããã£ã¹ã¯ãè£è¿ãã¢ãã¡ãŒã·ã§ã³ã®éäžã¯ã»ã«ãã¿ãããããŠãå
¥åãç¡å¹åããªããã°ãªããŸããããã®ãããªã UI ãšããå¯æ¥ã«é¢ä¿ããŠããããžãã¯ããè€éãªç¶æ
管çãå¿
èŠãšãªããã¡ã§ãããããã®ããžãã¯ã UI ã®ã³ãŒãããåé¢ããŠåäœãã¹ãã§ãããšæãŸããã§ãã
UI ã ãã§ãªãããã¡ã€ã« I/O ãããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ããããã¯ãŒã¯ãä»ããéä¿¡ãªã©ãçŽç²ãªããžãã¯ã§ã¯ãªãå€éšç°å¢ãé¢ä¿ããåŠçãåäœãã¹ãããã¥ããéšåã§ããæ¬ãã£ã¬ã³ãžã§ã¯ãã²ãŒã ã®ç¶æ ãã»ãŒãããã³ããŒãããåŠçãæ±ããŸãããã®ãããªåŠçãå®éã® I/O ããåé¢ããã»ãŒãã»ããŒãã䌎ãåŠçãåäœãã¹ãã§ãããšè¯ãã§ãããã
ãŸããçŸç¶ã§ã¯ã²ãŒã ã®ç¶æ
ïŒé»ã»çœã©ã¡ãã®çªããåæã¯ã€ããã®ãïŒãéåæåŠçã®å¶åŸ¡ãªã©ã®ç¶æ
管çã®ã³ãŒãã ViewController
äžã«æ£ãã°ã£ãŠããŸããããããæŽçããŠã³ãŒãã®èŠéããè¯ãããããšãè¯ãä¿®æ£ã«ã€ãªããã§ãããã
ãã®ä»ã®æ¹åæ§ãšããŠããæ°ã«å ¥ãã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠãåé·ãªã³ãŒããšæŠãããšãã§ããŸããããšãã°ãçŸç¶ã§ã¯éåæåŠçã®ã³ãŒãã¯äž»ã«ã³ãŒã«ããã¯é¢æ°ãããŒã¹ã«ããŠæžãããŠããŸããã©ã€ãã©ãªãå°å ¥ããŠã³ãŒããã·ã³ãã«ã«ããããšãã§ããŸãã
ãªããæ¬ãªããžããªã®å®è£ ã«ã¯ãã³ãŒããŒã±ãŒã¹ã§ã®ã¿çºçããæ¢ç¥ã®ãã°ãååšããŸãããã¹ããå°å ¥ãããªã©ããŠãã°ãçºèŠããä¿®æ£ã§ãããšæãŸããã§ãã
äžèšã®ãã¹ãŠãè¡ããªããšãããªãããã§ã¯ãããŸããããä»ã«åãçµãã¹ãåé¡ãããã§ããããããã§æããå 容ã¯åèçšåºŠã«ãšã©ããçæ³ã®èšèšã«ããã¯ãªãŒã³ãªã³ãŒããå®çŸããŠäžããã
ã¢ããªãæºããã¹ãä»æ§ã説æããŸããã·ã³ãã«ãªã¢ããªãªã®ã§ããããŸããªä»æ§ã¯å®éã«å®è¡ããŠæäœããŠã¿ãããšã§ææ¡å¯èœã§ããããã§ã¯ããã现ããã泚æãã¹ãä»æ§ã«ã€ããŠèª¬æããŸãã
æ¬ã¢ããªã«ã¯äººéãæäœãã "Manual" ãšã AI ãæäœãã "Computer" ã® 2 çš®é¡ã®ãã¬ã€ã€ãŒã¢ãŒããååšããŸãã
ãŠãŒã¶ãŒã¯ãé»ã»çœãšããã€ã§ããã¬ã€ã€ãŒã¢ãŒããåãæ¿ããããšãã§ããŸãã
"Manual" ã¯ç€ã®ã»ã«ãã¿ããããããšã§ãã£ã¹ã¯ãé 眮ããç¡å¹ãªæãšãªãã»ã«ã®ã¿ããïŒãã£ã¹ã¯ã 1 æãè£è¿ããªãããã§ã«ãã£ã¹ã¯ã眮ãããŠãããªã©ïŒããå ¥åå¯èœãªç¶æ ã§ãªãïŒ "Computer" ã®æèäžããã£ã¹ã¯ãè£è¿ãããã¢ãã¡ãŒã·ã§ã³ã®éäžãªã©ïŒå Žåãå ¥åã¯ç¡èŠãããŸãã
"Computer" ã®æèã¯éåæçã«è¡ããããã®æèäžããŠãŒã¶ãŒã®å ¥åã¯ãããã¯ãããŸããã "Computer" ã®æèäžã¯ããã®ããšã瀺ãã€ã³ãžã±ãŒã¿ïŒäžå³å³ç«¯ïŒã衚瀺ããŸãã
"Computer" ã®æèäžã«ãã¬ã€ã€ãŒã¢ãŒãã "Manual" ã«åãæ¿ããããå Žåã "Computer" ã®æèãåæ¢ããã€ã³ãžã±ãŒã¿ãé ããªããã°ãªããŸããã
"Computer" ã®æèããžãã¯èªäœã¯æ¬ãã£ã¬ã³ãžã®èª²é¡ã§ã¯ãããŸãããæ¬ãªããžããªã®å®è£ ã§ã¯ãæå¹ãªæããã©ã³ãã ã«äžã€ãéžæãã 2 ç§åŸã«çµæãè¿ããŸããç¬èªã®ããžãã¯ãå®è£ ããŠãæ§ããŸããããæ¬ãã£ã¬ã³ãžã®è©äŸ¡å¯Ÿè±¡ã«ã¯å«ãŸããŸããã
ãã£ã¹ã¯ã眮ãã»è£è¿ãåŠçã¯éåæã®ã¢ãã¡ãŒã·ã§ã³ã䌎ããäžæãã€é çªã«åŠçãããŸãã
ã¢ãã¡ãŒã·ã§ã³ã®éäžã§ããŠãŒã¶ãŒã®å ¥åã¯ãããã¯ãããŸããã
ã¢ãã¡ãŒã·ã§ã³ã®é çªã¯æ¬¡ã®ããã«æ±ºããããŠããŸãã
- æåã«ãæ°ããªãã£ã¹ã¯ãé 眮ãã
- å·Šäžãäžãå³äžãå³ãå³äžãäžãå·Šäžãå·Šã®æ倧 8 åã®ãã£ã¹ã¯ãè£è¿ãå¯èœæ§ãããããããã«åæããé ã«ãååå ã®ãã£ã¹ã¯ãè£è¿ã
- ååå ã§ã¯ãæ°ãã«é 眮ããããã£ã¹ã¯ã«è¿ããã£ã¹ã¯ããé ã«è£è¿ããã
ããšãã°ã x
ãé»ã o
ãçœã®ãã£ã¹ã¯ãè¡šãã -
ããã£ã¹ã¯ã®é
眮ãããŠããªãã»ã«ãè¡šããã®ãšããŠãä»ãç€ã®ç¶æ
ã次ã®éããšããŸãã
--------
x-------
-o------
--ooo---
---ox---
-----oox
---ooo--
--o-x---
ãã®ãšããäžå³ã® #
ã®äœçœ®ã«é»ïŒ x
ïŒã®ãã£ã¹ã¯ã眮ãããšããŸãã
--------
x-------
-o------
--ooo---
---ox---
----#oox
---ooo--
--o-x---
ãããšããã£ã¹ã¯ã眮ãã»è£è¿ãã¢ãã¡ãŒã·ã§ã³ã¯æ¬¡ã®é çªã«å®è¡ãããŸãã
--------
x-------
-4------
--3oo---
---2x---
----156x
---o7o--
--o-x---
ãã®çµæãæçµçã«ç€ã®ç¶æ ã¯æ¬¡ã®ããã«ãªããŸãã
--------
x-------
-x------
--xoo---
---xx---
----xxxx
---oxo--
--o-x---
ãªããããã»ã«ã®ãã£ã¹ã¯ã眮ãããè£è¿ãããããã¢ãã¡ãŒã·ã§ã³ã¯ BoardView
ããã³ CellView
ã§å®è£
ãããŠãããã¢ãã¡ãŒã·ã§ã³èªäœãç¬èªã«å®è£
ããå¿
èŠã¯ãããŸããã
é»ã»çœããããã®ãã£ã¹ã¯ã®ææ°ãç»é¢äžã«è¡šç€ºããŸãã
ãã£ã¹ã¯ã眮ããããã£ã¹ã¯ã®ææ°ãæŽæ°ãããå Žåããã¹ãŠã®ãã£ã¹ã¯ãè£è¿ãããåŸã§ãŸãšããŠææ°ã®è¡šç€ºãæŽæ°ããŸããäœæã®ãã£ã¹ã¯ãè£è¿ãããŠãã 1 æã«ã€ãäžåºŠã ãææ°ã®è¡šç€ºãæŽæ°ãããŸãã
ãã£ã¹ã¯ã 1 æè£è¿ã床ã«ææ°ã®è¡šç€ºãæŽæ°ããŠã¯ãããŸããïŒå®éã«ãã®ãããªä»æ§ãè©ŠããŠã¿ããšãããèŠã¥ããã£ãããçŸä»æ§ãšãªããŸããïŒãç€ã®ç¶æ ã®å€åãæ€ç¥ããèªåçã«ææ°ã®è¡šç€ºãæŽæ°ãããããªã³ãŒãã§ã¯ããã®ä»æ§ãããŸãæ±ããŸãããäžé£ã®åŠçããŸãšããŠæ±ãå¿ èŠããããŸãã
ãŠãŒã¶ãŒã¯ "Reset" ãã¿ã³ãæŒãããšã§ããã€ã§ãã²ãŒã ãåæåããããšãã§ããŸããåæåã®å 容ã¯æ¬¡ã®éãã§ãã
- ç€ãåæç¶æ ã«æ»ã
- é»ã®ã¿ãŒã³ã«ãã
- é»ã»çœãšããã¬ã€ã€ãŒã¢ãŒãã "Manual" ã«ãã
ãªããç€ã®åæç¶æ ã¯åè¿°ã®è¡šèšãçšãããšæ¬¡ã®ãšããã§ãã
--------
--------
--------
---ox---
---xo---
--------
--------
--------
誀æäœã«ãã£ãŠã²ãŒã ãåæåãããŠããŸããªãããã«ã "Reset" ãã¿ã³ãæŒããããšæ¬¡ã®ãããªã¢ã©ãŒãã衚瀺ããŠããŠãŒã¶ãŒã®ææã確èªããŸãã "Cancel" ãéžæãããå Žåã«ã¯ãã²ãŒã ã®åæåã¯è¡ãããŸããã
ãã£ã¹ã¯ãè£è¿ãã¢ãã¡ãŒã·ã§ã³ã®éäžã "Computer" ã®æèäžã "Reset" ãã¿ã³ã¯æå¹ã§ãããããã®éåæåŠçãåæ¢ããŠãã ã¡ã«ã²ãŒã ãåæåããå¿ èŠããããŸãã
"Reset" ãã¿ã³ã«ãã£ãŠãã¬ã€ã€ãŒã¢ãŒããåæåããããšããããšã¯ããã¬ã€ã€ãŒã¢ãŒãã¯ãŠãŒã¶ãŒå ¥åã ãã§ãªãããã°ã©ã ãããå€æŽããåŸããšããããšã§ãã
ä»ãé»ã®ã¿ãŒã³ãªã®ããçœã®ã¿ãŒã³ãªã®ãããããšãã²ãŒã ã®åæãçããç¶æ ãªã®ããã¡ãã»ãŒãžãšãªã¢ã«è¡šç€ºããŸãã
é»ãŸãã¯çœã®ã¿ãŒã³ã®å Žåã¯ã¡ãã»ãŒãžãšãªã¢ã« "â's turn" ãšè¡šç€ºããŸãã "â" ã®éšåã«ã¯é»ãŸãã¯çœã®å圢ãå
¥ããŸããæ¬ãªããžããªã®å®è£
ã§ã¯ã"â" ã®éšåã®è¡šç€ºã« DiskView
ïŒ CellView
ã®å
éšã§äœ¿çšãããŠãããé»ãŸãã¯çœã®å圢ã衚瀺ãããã¥ãŒã³ã³ããŒãã³ãïŒãçšããããŠããŸãã
ã²ãŒã ã®åæãçããå Žåã¯ãã¡ãã»ãŒãžãšãªã¢ã« "â won" ãšè¡šç€ºããŸãã "â" ã®åãæ±ã㯠"â's turn" ã®ãšããšåãã§ãããã ããåŒãåãã®å Žåã«ã¯ "Tied" ãšè¡šç€ºããŸãã
"Tied" ã®ãšã㯠"â" ã衚瀺ãããã "Tied" ãæ°Žå¹³æ¹åäžå€®ã«è¡šç€ºãããŸãããã®ãããªã¬ã€ã¢ãŠãã¯æ¬ãªããžããªã®å®è£ ããã®ãŸãŸèžè¥²ããŠæ§ããŸããã UI ã®ã¬ã€ã¢ãŠãã¯æ¬ãã£ã¬ã³ãžã®èª²é¡ã§ã¯ãããŸããã
æå¹ãªæãååšããªãå Žåããã®ãã¬ã€ã€ãŒã®ã¿ãŒã³ã¯ãã¹ãããŸãã
ãã¹ãããå Žåã次ã®ãããªã¢ã©ãŒãã衚瀺ããŸãã
"Dismiss" ãã¿ã³ãæŒããããšãã¹ã®åŠçãè¡ããã次ã®ãã¬ã€ã€ãŒã®ã¿ãŒã³ã«ç§»ããŸãã
ãã¹ãããã¬ã€ã€ãŒã "Computer" ã§ãã£ãŠããã¢ã©ãŒãã®è¡šç€ºã¯å¿ èŠã§ãããã®å Žåã "Computer" ã®æèã¯è¡ããã«ãã ã¡ã«ã¢ã©ãŒãã衚瀺ãããŸãã
äž¡ãã¬ã€ã€ãŒãšãæå¹ãªæãååšããªãå Žåã«ã¯ããã¹ã§ã¯ãªãã²ãŒã çµäºãšãªããŸãããã¹ã®ã¢ã©ãŒãã衚瀺ããŸããã
ã¢ã©ãŒãã衚瀺ã "Dismiss" ãã¿ã³ãæŒããããŸã§ã®éã¯ãã¡ãã»ãŒãžãšãªã¢ã« "â's turn" ãšããã®ãã¹ãããã¬ã€ã€ãŒã®ã¿ãŒã³ã§ããããšã衚瀺ããªããã°ãªããŸããã
ãã¹ã®å€å®ã¯ UI ãä»åšãããã«ããžãã¯ã ãã§å®çµã§ããŸãããã¢ã©ãŒããšã¡ãã»ãŒãžãšãªã¢ã®ã¿ãŒã³è¡šç€ºãæ±ããããããšã§ããã¹ã®åŠçãš UI ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãé£æºãããªããã°ãªããŸãããåçŽã«ãã¹ã®åŠçãããžãã¯ã§å®çµãããŠããŸããšããããã®è¡šç€ºãçç¥ãããŠããŸããŸãã
ã²ãŒã ã®éäžã§ã¢ããªã匷å¶çµäºãããŠããŸã£ãŠãåãç¶æ³ããã²ãŒã ãåéã§ããããã«ãèªåçã«ã²ãŒã ã®ç¶æ ãä¿åãããŸããã¢ããªéå§æã«ã¯ãæåŸã«ä¿åãããã²ãŒã ã®ç¶æ ãèªã¿èŸŒãŸããŸãã
ä¿åãããé ç®ã¯æ¬¡ã®éãã§ãã
- é»ã»çœã©ã¡ãã®ã¿ãŒã³ãããŸãã¯åæãçããŠããã®ã
- é»ã»çœããããã®ãã¬ã€ã€ãŒã¢ãŒãã "Manual" ã "Computer" ã
- ç€ã®ç¶æ ïŒ 64 åã®ã»ã«ããããã«ããã£ã¹ã¯ã眮ãããŠããªããããŸãã¯é»ã»çœã©ã¡ãã®ãã£ã¹ã¯ã眮ãããŠãããïŒ
ä¿åã¯ã 1 æããšããŸãã¯ãã¬ã€ã€ãŒã¢ãŒããå€æŽãããå Žåã«èªåçã«è¡ãããŸãã
æ¬ãªããžããªã®å®è£ ã§ã¯ããã£ã¹ã¯ãè£è¿ãã¢ãã¡ãŒã·ã§ã³ãå®äºããŠããä¿åãè¡ãããŸããããã¯ã UI ãšããžãã¯ãåé¢ãããŠããªãããã UI ã®æŽæ°ãè¡ãããªããšç¶æ ã®å€æŽãå®äºããªãããã§ãããªãã¡ã¯ã¿ãªã³ã°ã®çµæãšããŠãã¢ãã¡ãŒã·ã§ã³ã®å®äºãåŸ ããã«ç¶æ ã®å€æŽãå åãããŠä¿åããŠãæ§ããŸããã
æ¬ãªããžããªã®èª²é¡çšã³ãŒãã«ã€ããŠèª¬æããŸãã
æå³ã®ããã³ãŒããæžãããŠããã®ã¯æ¬¡ã® 5 ãã¡ã€ã«ã§ãã
ãã¡ã€ã« | æäŸããäž»ãªå | æŠèŠ |
---|---|---|
ViewController.swift | ViewController |
ã¢ããªæ¬äœïŒ UIViewController ã®ãµãã¯ã©ã¹ïŒ |
BoardView.swift ïŒ Xcode äžã§ã¯ Views ã°ã«ãŒãã®äžïŒ |
BoardView |
ãªããŒã·ã®ç€ãè¡šããã¥ãŒïŒ UIView ã®ãµãã¯ã©ã¹ïŒ |
CellView.swift ïŒ Xcode äžã§ã¯ Views ã°ã«ãŒãã®äžïŒ |
CellView |
ãªããŒã·ã®ç€ã®ã»ã«ãè¡šããã¥ãŒïŒ UIView ã®ãµãã¯ã©ã¹ïŒ |
DiskView.swift ïŒ Xcode äžã§ã¯ Views ã°ã«ãŒãã®äžïŒ |
DiskView |
ãªããŒã·ã®ãã£ã¹ã¯ãè¡šããã¥ãŒïŒ UIView ã®ãµãã¯ã©ã¹ïŒ |
Disk.swift ïŒ Xcode äžã§ã¯ DataTypes ã°ã«ãŒãã®äžïŒ |
Disk |
ãªããŒã·ã®ãã£ã¹ã¯ïŒé»ãçœãïŒãè¡šãããŒã¿æ§é ïŒ enum ïŒ |
åºæ¬çã« ViewController.swift 以å€ã«ã¯æãå ããå¿
èŠã¯ãããŸãã ã BoardView
, CellView
, DiskView
ã¯ãªããŒã·çšã«çšæããããã¥ãŒã¯ã©ã¹ã§ã UIKit ã®ã³ã³ããŒãã³ããšåãæèŠã§å©çšã§ããŸãã UISwitch
ã«äžæºããã£ãŠã UISwitch
ãã®ãã®ãæ¹å€ããã®ã§ã¯ãªããã©ãããŒã¯ã©ã¹ã extension
ã§å¯Ÿå¿ãããšæããŸãã BoardView
çã«ã€ããŠãåæ§ã§ãããŸãã CellView
ã«é¢ããŠã¯èª²é¡ææŠè
ãçŽæ¥å©çšããããšããããŸããïŒ BoardView
ãå
éšçã«å©çšããŠããŸãïŒã DiskView
ã«ã€ããŠãå©çšæ©äŒã¯éå®çã§ãã Disk
ã¯é»ãçœããè¡šãå°ã㪠enum
ãªã®ã§ãå®è³ªçã«äœ¿ãæ¹ãèŠããå¿
èŠãããã®ã¯ BoardView
ã ãã§ãã BoardView
ã«ããŠãã UIKit ã®ãã¥ãŒã¯ã©ã¹çŸ€ãšäŒŒã API ãæã€ã®ã§ãããã«äœ¿ãæ¹ãç解ã§ãããšæããŸãã
以äžãäžã€ãã€èª¬æããŸãïŒ CellView.swift ã¯çç¥ããŸãïŒãããã§çŽ¹ä»ãã API ã«ã€ããŠã¯ããã¥ã¡ã³ããŒã·ã§ã³ã³ã¡ã³ããæžãããŠããã®ã§ã Xcode äžã§ç¢ºèªããããšãã§ããŸãã
ãã£ã¹ã¯ãé»ïŒ dark ïŒãçœïŒ light ïŒããè¡šã次ã®ãã㪠enum
ãå®è£
ãããŠããŸãã
public enum Disk {
case dark
case light
}
Disk
ã¯è£å©çã«ããã€ãã® API ãæäŸããŸãã Disk
ãæäŸãã API ã¯æ¬¡ã®éãã§ãã
API | æŠèŠ |
---|---|
mutating func flip() |
èªèº«ã®å€ããçŸåšã®å€ã .dark ãªã .light ã«ã .light ãªã .dark ã«å転ãããŸãã |
var flipped: Disk { get } |
èªèº«ã®å€ãå転ãããå€ïŒ .dark ãªã .light ã .light ãªã .dark ïŒãè¿ããŸãã |
static var sides: [Disk] { get } |
[.dark, .light] ãè¿ããŸãã |
ãã£ã¹ã¯ãè¡šããã¥ãŒ DiskView
ãå®è£
ãããŠããŸãã
class DiskView: UIView
DiskView
ã¯äž»ã« CellView
ã§çšããããçŽæ¥ DiskView
ã䜿ãæ©äŒã¯å°ãªãã§ãããã¡ãã»ãŒãžãšãªã¢ãšãã£ã¹ã¯ã®ææ°ã®è¡šç€ºã®ããã«ããã£ã¹ã¯ã衚瀺ããããã«çšããããŠããŸãã
ç¹ã«ãã¡ãã»ãŒãžãšãªã¢ã«ã€ããŠã¯ "â's turn" ã "â's turn" ããåãæ¿ããå¿
èŠããããŸãã DiskView
ã衚瀺ãããã£ã¹ã¯ãè²ãå€æŽããã«ã¯ disk
ããããã£ãçšããŸãã
// 衚瀺ããããã£ã¹ã¯ã®è²ãé»ã«ãã
diskView.disk = .dark
// 衚瀺ããããã£ã¹ã¯ã®è²ãå転ãã
diskView.disk.flip()
DiskView
ãæäŸãã API ã¯æ¬¡ã®éãã§ãã
API | æŠèŠ |
---|---|
var disk: Disk { get set } |
ãã®ãã¥ãŒã衚瀺ãããã£ã¹ã¯ã®è²ã決å®ããŸãã |
var name: String { get set } |
Interface Builder ãããã£ã¹ã¯ã®è²ãèšå®ããããã®ããããã£ã§ãã "dark" ã "light" ã®æååãèšå®ããŸãã |
ãªããŒã·ã®ç€ãè¡šããã¥ãŒ BoardView
ãå®è£
ãããŠããŸãããŸãã BoardView
ã«å¯Ÿããã€ã³ã¿ã©ã¯ã·ã§ã³ããã³ããªã³ã°ããããã® BoardViewDelegate
ã宣èšãããŠããŸãã
class BoardView: UIView
protocol BoardViewDelegate: AnyObject
BoardView
㯠8 à 8 ã®ã»ã«ãæã¡ãŸãã BoardView
ã® API ãéããŠããããã®ã»ã«ã®ç¶æ
ïŒé»ãçœããã£ã¹ã¯ã眮ãããŠããªãïŒãååŸããããå€æŽãããããããšãã§ããŸãã
// 3 åç®ã» 4 è¡ç®ã®ã»ã«ã®ç¶æ
ãååŸ
let disk: Disk? = boardView.diskAt(x: 3, y: 4)
// 3 åç®ã» 4 è¡ç®ã®ã»ã«ãé»ã®ãã£ã¹ã¯ã眮ãããŠããç¶æ
ã«å€æŽ
boardView.setDisk(.dark, atX: 3, y: 4, animated: false)
åã»è¡ã¯ãããã x
, y
ã§è¡šããã 0 çªããå§ãŸãããšã«æ³šæããŠäžããããŸãããã£ã¹ã¯ã眮ãããŠããªãç¶æ
ã¯ãnil
ã§è¡šãããŸãã
setDisk()
ã¡ãœããã®åŒæ° animated
ã« true
ãæž¡ããå Žåãã»ã«ã®ç¶æ
ãå€æŽããã¢ãã¡ãŒã·ã§ã³ãå®è¡ãããŸããããã¯ã UISwitch
ã® setOn(_:animated:)
ã¡ãœããïŒåè: API ãªãã¡ã¬ã³ã¹ïŒã«é¡äŒŒããŠããŸããã¢ãã¡ãŒã·ã§ã³ã¯ãå€æŽååŸã®ã»ã«ã®ç¶æ
ã«ãã£ãŠ 3 çš®é¡ååšããŸãã
å | åŸ | ã¢ãã¡ãŒã·ã§ã³ã®å 容 |
---|---|---|
nil |
.dark ãŸã㯠.light |
ãã£ã¹ã¯ãé 眮ãããã |
.dark ãŸã㯠.light |
nil |
ãã£ã¹ã¯ãåãé€ãããã |
.dark ãŸã㯠.light |
å ãšå転 | ãã£ã¹ã¯ãè£è¿ãããã |
ã©ã®ã¢ãã¡ãŒã·ã§ã³ãé©çšããããã¯èªåçã«æ±ºå®ãããããããã® API ã®å©çšè ãã¢ãã¡ãŒã·ã§ã³ã®çš®é¡ãéžæããå¿ èŠã¯ãããŸããã
setDisk()
ãå©çšãããšãã¢ãã¡ãŒã·ã§ã³ã®å®äºéç¥ãã³ãŒã«ããã¯ã§åãåãããšãã§ããŸãã
boardView.setDisk(.dark, atX: 3, y: 4, animated: true) { isFinished in
// ã¢ãã¡ãŒã·ã§ã³å®äºæã«åŒã°ãã
}
ç¹ã«è€æ°æã®ãã£ã¹ã¯ãé çªã«é£ç¶ããŠè£è¿ãå Žåãªã©ã¯ããã®ã³ãŒã«ããã¯ãçšããŠã¿ã€ãã³ã°ãå¶åŸ¡ããããšãéèŠã«ãªããŸãã
setDisk()
ã«ããã¢ãã¡ãŒã·ã§ã³ããã£ã³ã»ã«ãã API ã¯ãããŸããããã ããã¢ãã¡ãŒã·ã§ã³ã®éäžã§ãåäžã®ã»ã«ã«æ°ããç¶æ
ãèšå®ãããå Žåã«ã¯é©åã«åŠçãããŸããããããUISwitch
ã® setOn(_:animated)
ã®æåã«äŒŒãŠããŸãã
ãªãã BoardView
㯠ãªããŒã·ã®ã«ãŒã«ã«é¢ãã API ãæã¡ãŸãã ãããšãã°ãããã»ã«ã«ãã£ã¹ã¯ãé
眮ãããšãã«åšå²ã®ãã£ã¹ã¯ãè£è¿ããããããã»ã«ã«ããè²ã®ãã£ã¹ã¯ãé
眮ã§ããããå€å®ãã API çã¯æäŸããŸãããåãªãã 8 à 8 ã®ã»ã«ãæã€ããŒãã«äžã®æ§é ãæã£ããã¥ãŒã«ãããŸããã
ãã®ä»ã«ãã BoardView
ã¯è£å©çã«ããã€ãã® API ãæäŸããŸãã BoardView
ãæäŸãã API ã¯æ¬¡ã®éãã§ãã
API | æŠèŠ |
---|---|
weak var delegate: BoardViewDelegate? |
ã»ã«ãã¿ããããããšãã®æåã移è²ããããã®ãªããžã§ã¯ãã§ãã |
func diskAt(x: Int, y: Int) -> Disk? |
x , y ã§æå®ãããã»ã«ã®ç¶æ
ãè¿ããŸããã»ã«ã«ãã£ã¹ã¯ã眮ãããŠããªãå Žå㯠nil ãè¿ããŸãã |
let height: Int |
ç€ã®é«ãïŒ 8 ïŒãè¿ããŸãã |
func reset() |
ç€ãã²ãŒã éå§æã«ç¶æ ã«æ»ããŸãããã®ã¡ãœããã¯ã¢ãã¡ãŒã·ã§ã³ã䌎ããŸããã |
func setDisk(_ disk: Disk?, atX x: Int, y: Int, animated: Bool, completion: ((Bool) -> Void)? = nil) |
x , y ã§æå®ãããã»ã«ã®ç¶æ
ãäžãããã disk ã«å€æŽããŸãã animated ã true ã®å Žåãã¢ãã¡ãŒã·ã§ã³ãå®è¡ãããŸããã¢ãã¡ãŒã·ã§ã³ã®å®äºéç¥ã¯ completion ã§åãåãããšãã§ããŸãã completion ãåãåã Bool å€ã¯ã UIView.animate() ïŒåè: API ãªãã¡ã¬ã³ã¹ïŒçã«æºããŸãã |
let width: Int |
ç€ã®å¹
ïŒ 8 ïŒãè¿ããŸãã |
let xRange: Range<Int> |
ç€ã®ã»ã«ã® x ã®ç¯å²ïŒ 0 ..< 8 ïŒãè¿ããŸãã |
let yRange: Range<Int> |
ç€ã®ã»ã«ã® y ã®ç¯å²ïŒ 0 ..< 8 ïŒãè¿ããŸãã |
BoardView
㯠BoardViewDelegate
ãéããŠãã»ã«ãã¿ãããããããšãéç¥ããŸãã
extension ViewController: BoardViewDelegate {
func boardView(_ boardView: BoardView, didSelectCellAtX x: Int, y: Int) {
// x åç®ã» y åç®ã®ã»ã«ãã¿ããããããšãã«åŒã°ãã
}
}
ãã㯠UITableView
ãš UITableViewDelegate
ã®é¢ä¿ã«äŒŒãŠããŸãã BoardView
ã® delegate
ããããã£ãçšã㊠BoardViewDelegate
ãèšå®ããŸããå
žåçã«ã¯ã View Controller ã BoardViewDelegate
ã«é©åããã delegate
ããããã£ã«æž¡ããŸãã
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
boardView.delegate = self
}
}
BoardViewDelegate
ã宣èšãã API ã¯æ¬¡ã®éãã§ãã
API | æŠèŠ |
---|---|
func boardView(_ boardView: BoardView, didSelectCellAtX x: Int, y: Int) |
boardView ã® x , y ã§æå®ãããã»ã«ãã¿ããããããšãã«åŒã°ããŸãã |
æ¬èª²é¡ã®å¯Ÿè±¡ãšãªã Fat View Controller ViewController
ãå®è£
ãããŠããŸãã
class ViewController: UIViewController
ViewController
ã®å®è£
ã¯äž»ã«æ¬¡ã® 8 åã®ããŒãã«åãããŠããŸãã
ããŒã | å 容ã |
---|---|
åé éš | ViewController ã®ããããã£ã®å®£èšã viewDidLoad() ã» viewDidAppear() ãªã©ã®å®è£
|
Reversi logics | ãã¹ã«ãã£ã¹ã¯ãããããããåæãå€å®ããã¡ãœãããªã©ã®å®è£ |
Game management | æ°èŠã²ãŒã ã®éå§ããŠãŒã¶ãŒã®å ¥ååŸ ã¡ãåæå€å®ãªã©ããªããŒã·ã®ã«ãŒã«èªäœã®å®è£ |
Views | ç¶æ å€æŽããã¥ãŒã«åæ ããããã®ã¡ãœããã®å®è£ |
Inputs | ãŠãŒã¶ãŒå ¥åããã³ããªã³ã°ããããã®ã¡ãœããã®å®è£ |
Save and Load | ã²ãŒã ã®ç¶æ ããã¡ã€ã«ã«ä¿åã»èªã¿èŸŒã¿ããããã®ã¡ãœããã®å®è£ |
Additional types | ãã®ãã¡ã€ã«ã§å©çšããè£å©çãªåã®å®è£ |
File-private extensions | ãã®ãã¡ã€ã«ã§å©çšããè£å©ç㪠extension ã®å®è£
|
ViewController
ã®å®è£
ã§ç¹çãã¹ãããšãšããŠããªããŒã·ã®ç€ã®ç¶æ
ã BoardView
ã€ã³ã¹ã¿ã³ã¹ã§ç®¡çãããŠããããšãæããããŸãã boardView
ããããã£ããã®åœ¹å²ãæ
ã£ãŠããŠãã¢ãã«ãšãã¥ãŒã®ã³ãŒããæ··ãããã£ãç¶æ
ã§ããããã«ããã£ã¹ã¯ã眮ããããšãã«åšèŸºã®ãã£ã¹ã¯ãã²ã£ããè¿ãåŠçãå®è£
ãã placeDisk(_:atX:y:animated:completion:)
ã¡ãœããïŒãšããã®äžããåŒã³åºãããŠãã animateSettingDisks(at:to:completion:)
ã¡ãœããïŒã§ã¯ãããŒã¿ã®å€æŽãšã¢ãã¡ãŒã·ã§ã³ãäºãã«å¯æ¥ã«é¢ä¿ããåŠçãè¡ã£ãŠããŸãããããã¯ç¹ã« "Reversi logics" ã«é¢ä¿ãæ·±ãã§ãã
å
šäœã®åŠçã®æµãã¯ã"Game management" ã§ç®¡çãããŠããã waitForPlayer()
ã¡ãœããã«ãããã¬ã€ã€ãŒã®è¡ååŸ
ã¡ïŒ "Manual" ã®å Žåã¯ãŠãŒã¶ãŒã®å
¥ååŸ
ã¡ïŒãšããã®çµæãåããŠæ¬¡ã®ç¶æ
ïŒæ¬¡ã®ãã¬ã€ã€ãŒã®çªãããã¹ããåæã決ããŠçµæ衚瀺ãïŒãžã®é·ç§»ãæ±ã nextTurn()
ã¡ãœããããã®äžå¿ã§ããå
žåçã«ã¯ã
waitForTurn()
ã§ãã¬ã€ã€ãŒã®è¡ååŸ ã¡- ãã¬ã€ã€ãŒã®è¡åãåããŠ
placeDisk(_:atX:y:animated:completion:)
ã§ãã£ã¹ã¯ãã²ã£ããè¿ã nextTurn()
ã§æ¬¡ãã¬ã€ã€ãŒã«é·ç§»
ãç¹°ãè¿ãããšã§ã²ãŒã ãé²è¡ããŸããæå㯠viewDidAppear()
㧠waitForTurn()
ãåŒã°ããããšã§ãã®ã«ãŒãã«çªå
¥ããŸãã
ä»ã«ãããã¥ããç¹ãšããŠã¯ã animationCanceller
ããããã£ãš playerCancellers
ããããã£ããããŸããæ¬ã¢ããªã«ã¯éåæåŠçã®ãã£ã³ã»ã«ãå¿
èŠã«ãªãã±ãŒã¹ãšããŠããã£ã¹ã¯ãã²ã£ããè¿ãã¢ãã¡ãŒã·ã§ã³ã®éäžã§ã®ã²ãŒã ãªã»ãããšããã¬ã€ã€ãŒã®è¡ååŸ
ã¡äžã®ãã¬ã€ã€ãŒã¢ãŒãã®åãæ¿ãããããŸããåè
ã§ã¯ã¢ãã¡ãŒã·ã§ã³ãäžæããªããšãããŸãããåŸè
ã§ã¯ãããšãã°ã "Computer" ãã "Manual" åãæ¿ãã£ãã®ã«ã AI ã®æèãå®äºããŠåæã«ãã£ã¹ã¯ã眮ããããšãããããªäºæ
ãé²ããªããã°ãªããŸããããããã®ãã£ã³ã»ã«åŠçã管çããã®ã animationCanceller
ããããã£ãš playerCancellers
ããããã£ã§ãã察å¿ããéåæåŠçäžã«ã¯ãããã®ããããã£ã«ãã£ã³ã»ã©ãŒãä¿æãããéåæåŠçãçµãããš nil
ãã»ãããããŸãã
@IBOutlet
ã§æ¥ç¶ãããããããã£ãšã察å¿ãããã¥ãŒã®é¢ä¿ã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã
ãã£ã¬ã³ãžã®çµæäžèŠ§ã§ããæ²èŒãåžæãããæ¹ã¯ãäžèšã®è¡šã«è¡ãè¿œå ãã Pull Request ããéãäžããã
ãªããžã㪠| äœè | ã¢ãŒããã¯ãã£ãã¿ãŒã³ | ãã¬ãŒã ã¯ãŒã¯ | UI | åè |
---|---|---|---|---|---|
refactoring-challenge/reversi-ios | @koher | Fat View Controller | - | UIKit | æ¬ãªããžã㪠|