åã«é¢ããŠå®å šãªããã°ã©ãã³ã°èšèªã䜿çšãããšãããã¯ã1ã€ã®åã®ã¿ã§åäœããã³ãŒããèšè¿°ãããããªäžè¬çãªåé¡ã§ãããå¥ã®åã§ã¯éåžžã«æ£ç¢ºã§ãã ããšãã°ãé¢æ°ã2ã€ã®æŽæ°ãè¿œå ãããšããŸãã 2ã€ã®æµ®åå°æ°ç¹æ°ãè¿œå ããé¢æ°ã¯éåžžã«ãã䌌ãŠããŸãããå®éã«ã¯åãããã«èŠããŸãã
å¯äžã®éãã¯ãå€æ°ã®å€ã¿ã€ãã§ãã
匷ãåä»ããããèšèªã§ã¯ãåã ã®é¢æ°ãaddIntsãaddFloatsãaddDoublesãªã©ãšããŠå®çŸ©ããå¿ èŠããããŸããåé¢æ°ã«ã¯æ£ããåŒæ°ããããåãè¿ããŸãã
å€ãã®ããã°ã©ãã³ã°èšèªã¯ããã®åé¡ã®è§£æ±ºçãå®è£ ããŠããŸãã ããšãã°ãC ++ã¯ãã³ãã¬ãŒãã䜿çšããŸãã SwiftãJavaãšCïŒã®äž¡æ¹ããžã§ããªãã¯ã䜿çšããŠãã-ãããã£ãŠããã®ãã¥ãŒããªã¢ã«ã®ãããã¯ã§ãïŒ
äžè¬åãããSwiftããã°ã©ãã³ã°ã«é¢ãããã®èšäºã§ã¯ãæ¢ã«èŠããã®ãå«ããããã°ã©ãã³ã°èšèªã®æ¢åã®ãžã§ããªãã¯ã®äžçã«é£ã³èŸŒã¿ãŸãã 次ã«ããŠãŒã¶ãŒã®æ€çŽ¢æ¡ä»¶ã远跡ããã«ã¹ã¿ã ãŠãããŒãµã«ããŒã¿æ§é ã䜿çšããŠãFlickrã§åçæ€çŽ¢ããã°ã©ã ãäœæããŸãã
æ³šïŒ ãã®Swifté¢æ°åããã°ã©ãã³ã°ã®èšäºã¯ãSwiftã®åºæ¬ããã§ã«ç¥ã£ãŠãã人åãã§ãã Swiftã®åºæ¬ã«æ £ããŠããªãå Žåã¯ãæåã«ä»ã®Swiftãã¥ãŒããªã¢ã«ããã§ãã¯ããããšããå§ãããŸãã
ãžã§ããªãã¯å»è¬åã®çŽ¹ä»
ããªãã¯ãããç¥ããªããããããŸãããããããããžã§ããªãã¯ãSwiftã§åäœããŠããã®ãèŠãããšãããã§ãããã é åãšèŸæžã¯ãããžãã¹ã«ãããäžè¬çãªã»ãã¥ãªãã£ã®å žåçãªäŸã§ãã
Objective-Céçºè ã¯ãåãã³ã¬ã¯ã·ã§ã³å ã®ç°ãªãã¿ã€ãã®ãªããžã§ã¯ããå«ãé åãšèŸæžã«æ £ããŠããŸãã ããã«ããæè»æ§ãåäžããŸãããAPIããè¿ãããé åãã¹ãã¬ãŒãžçšã§ããããšããåç¥ã§ããïŒ å¥ã®åœ¢åŒã®ããã¥ã¡ã³ãã§ããããã¥ã¡ã³ããŸãã¯å€æ°åãèŠããšç¢ºèªã§ããŸãã ããã¥ã¡ã³ãã®å Žåã§ããå®è¡æã«ã³ã¬ã¯ã·ã§ã³ã®ãšã©ãŒãé²ãæ¹æ³ã¯ãããŸããïŒãšã©ãŒã®ãªãã³ãŒã以å€ã«ã¯ãããŸããïŒïŒã
äžæ¹ãSwiftã«ã¯é åãšèŸæžããããŸãã Intsé åã«ã¯Intsã®ã¿ãå«ããããšãã§ããããšãã°Stringãå«ããããšã¯ã§ããŸããã ããã¯ãã³ãŒããèšè¿°ããããšã§ã³ãŒããç»é²ã§ããããšãæå³ããŸããããã«ãããã³ã³ãã€ã©ã¯åãã§ãã¯ãå®è¡ã§ããŸãã
ããšãã°ãObjective-C UIKitã§ã¯ããŠãŒã¶ãŒãã¥ãŒã«åºã¥ããŠã¿ãããåŠçããã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
ãåç¥ã®ããã«ããã®ã¡ãœããã®ã»ããã«ã¯UITouchã€ã³ã¹ã¿ã³ã¹ã®ã¿ãå«ãŸããŠããŸãããããã¯ããã¥ã¡ã³ãã«èšèŒãããŠããããã§ãã ãããããªããžã§ã¯ããä»ã®äœãã«ãªãããšã劚ãããã®ã¯äœããããŸãããéåžžãã»ããå ã®ã¿ãããUITouchã€ã³ã¹ã¿ã³ã¹ãšããŠææ¡ããŠãããããUITouchãªããžã§ã¯ããšããŠå¹æçã«æ±ãå¿ èŠããããŸãã
çŸæç¹ã§ã¯ãSwiftã«ã¯æšæºã©ã€ãã©ãªã§å®çŸ©ãããŠããã»ããããããŸããã ãã ããã»ããã§ã¯ãªãé åã䜿çšããå Žåã¯ãäžèšã®ã¡ãœããã次ã®ããã«èšè¿°ã§ããŸãã
func touchesBegan(touches: [UITouch]!, withEvent event: UIEvent!)
ããã¯ãtouchsé åã«UITouchã€ã³ã¹ã¿ã³ã¹ã®ã¿ãå«ãŸããŠããããšã瀺ãããã®ã¡ãœããã䜿çšããã³ãŒããä»ã®ãã®ãæž¡ãããšãããšãã³ã³ãã€ã©ãŒã¯ãšã©ãŒãã¹ããŒããŸãã åãã³ã³ãã€ã©ã«ãã£ãŠèšå®/å®çŸ©ãããã ãã§ãªããUITouchã€ã³ã¹ã¿ã³ã¹ã®èŠçŽ ãèšç®ããå¿ èŠããªããªããŸãïŒ
äžè¬ã«ããžã§ããªãã¯ã¯ã¯ã©ã¹ã®ãã©ã¡ãŒã¿ãŒãšããŠåãæäŸããŸãã ãã¹ãŠã®é åã¯åãããã«æ©èœããå€ããªã¹ãã«ä¿åããŸãããäžè¬çãªé åã¯å€ã®ã¿ã€ãããã©ã¡ãŒã¿ãŒåããŸãã é åã§äœ¿çšããã¢ã«ãŽãªãºã ã¯éåºæã§ã¯ãªãããããã¹ãŠã®ã¿ã€ãã®å€ãæã€ãã¹ãŠã®é åã§ããããåé¢ã§ããŸãã
ãžã§ããªãã¯ãšãã®å©ç¹ã«é¢ããåºæ¬çãªæ å ±ãåŸãããã®ã§ãããããç¹å®ã®ã·ããªãªã«å®å šã«é©çšã§ããŸãã
ãžã§ããªãã¯ã®ä»çµã¿
ãžã§ããªãã¯ããã¹ãããã«ã¯ãFlickrã§ç»åãæ€çŽ¢ããã¢ããªã±ãŒã·ã§ã³ãäœæããå¿ èŠããããŸãã
ãã®ãã¥ãŒããªã¢ã«ã®ã¹ã¿ãŒã¿ãŒãããžã§ã¯ããããŠã³ããŒãããããšããå§ããŸã ã éããŠãããã«ã¡ã€ã³ã¯ã©ã¹ã«æ £ããŸãã Flickrã¯ã©ã¹ã¯Flickr APIãåŠçã§ããŸãã ãã®ã¯ã©ã¹ã«ããAPIã®ããŒã¯ããã«æäŸãããŸãããã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµããå Žåã¯ç¬èªã®ããŒã䜿çšã§ããŸãã ãã¡ãã§è³Œèªã§ããŸã ã
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ãããšã次ã®ããã«è¡šç€ºãããŸãã
ãŸã ãŸã ã§ãïŒ æãããªãã§ãã ãããç«ãšäžç·ã«åçãããã«è¡šç€ºãããŸãã
é åºä»ãèŸæž
ã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒãªã¯ãšã¹ãããšã«ç»åãã¢ããããŒãããææ°ã®æ€çŽ¢ãç»é¢ã®äžéšã«ãªã¹ããšããŠè¡šç€ºãããŸãã
ãããããŠãŒã¶ãŒãåãã¢ã€ãã ã2åæ€çŽ¢ãããšã©ããªããŸããïŒ ã¢ããªã±ãŒã·ã§ã³ãå€ãçµæãæ°ãããªã¹ãã®äžçªäžã«ç§»åããæ°ããçµæã«çœ®ãæããã°ãããšæããŸãã
ããŒã¿æ§é ã«é åã䜿çšããŠçµæãè¿ãããšãã§ããŸããããžã§ããªãã¯ã調ã¹ãã«ã¯ãæ°ããã³ã¬ã¯ã·ã§ã³ãã€ãŸãé åºââä»ããããèŸæžãäœæããå¿ èŠããããŸãã
å€ãã®ããã°ã©ãã³ã°èšèªãšãã¬ãŒã ã¯ãŒã¯ïŒSwiftãå«ãïŒã§ã¯ãé åãšã¯ç°ãªããã»ãããšèŸæžã¯é åºãä¿èšŒããŸããã é åºä»ããããèŸæžã¯éåžžã®èŸæžã®ããã«èŠããŸãããç¹å®ã®é åºã§ããŒãå«ãŸããŠããŸãã ãã®æ©èœã䜿çšããŠæ€çŽ¢çµæãä¿åããŸããããã«ãããçµæããã°ããæ€çŽ¢ããããè¡šã®é åºãç¶æãããã§ããŸãã
æ éã§ãªãå Žåã¯ããŠãŒã¶ãŒããŒã¿æ§é ãäœæããŠãé åºä»ããããèŸæžãåŠçã§ããŸãã ããããããªãã¯å èŠã®æããããŸãïŒ ä»åŸæ°å¹Žéãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ãããã®ãäœæããããšèããŠããŸãã ãžã§ããªãã¯ã¯çæ³çãªãªãã·ã§ã³ã§ãã
äžæ¬¡ããŒã¿æ§é
[ãã¡ã€ã«]ã[æ°èŠ]ã[ãã¡ã€ã«]ã[iOS]ã[ãœãŒã¹]ã[ã¹ãŠã£ãããã¡ã€ã«]ã®é ã«éžæããŠãæ°ãããã¡ã€ã«ãè¿œå ããŸãã [次ãž]ãã¯ãªãã¯ãããã¡ã€ã«ã«OrderedDictionaryãšããååãä»ããŸãã æåŸã«ãäœæãã¯ãªãã¯ããŸãã
ãã®çµæã空ã®Swiftãã¡ã€ã«ãäœæããã次ã®ã³ãŒããè¿œå ããå¿ èŠããããŸãã
struct OrderedDictionary { }
ãããŸã§ã®ãšãããããã¯é©ãããšã§ã¯ãããŸããã ãªããžã§ã¯ãã¯å€ã®ã»ãã³ãã£ã¯ã¹ãæããªããã°ãªããªããããæ§é äœã«ãªããŸãã
泚 ïŒ èŠããã«ãæå³ã®ã»ãã³ãã£ã¯ã¹ã¯ãããããªãã¯ãªã³ã¯ãã§ã¯ãªããã³ããŒ/貌ãä»ãããšèšãçããæ¹æ³ã§ãã å€ã®ã»ãã³ãã£ã¯ã¹ã«ã¯å€ãã®å©ç¹ããããŸããããšãã°ãäºæããããŒã¿ãå€æŽããå¯èœæ§ã®ããã³ãŒãã®å¥ã®éšåãå¿é ããå¿ èŠã¯ãããŸããã 詳现ã«ã€ããŠã¯ã第3ç« ã®ã¬ãã¹ã³ã ã¯ã©ã¹ãšæ§é ã㧠Swiftãç解ããæ¹æ³ãåç §ããŠãã ããã
ããã§ããžã§ããªãã¯ã«ããå¿ èŠããããããå¿ èŠãªã¿ã€ãã®å€ãå«ããããšãã§ããŸãã æ§é å®çŸ©ã次ã®ããã«å€æŽããŸãã
struct OrderedDictionary<KeyType, ValueType>
å±±ã«ãã³å ã®èŠçŽ ã¯ããžã§ããªãã¯åãã©ã¡ãŒã¿ãŒã§ãã KeyTypeãšValueTypeã¯ããèªäœã¯åã§ã¯ãªããæ§é å®çŸ©å ã®åã®ä»£ããã«äœ¿çšã§ãããã©ã¡ãŒã¿ãŒã«ãªããŸãã ç解ã§ããªããã°ãè¿ãå°æ¥ã«ãã¹ãŠãæããã«ãªãã§ãããã
é åºä»ãèŸæžãå®è£ ããæãç°¡åãªæ¹æ³ã¯ãé åãšèŸæžã®äž¡æ¹ãç¶æããããšã§ãã èŸæžã«ã¯ãããŒã¿å€æãšé åããŒãæ ŒçŽãããŸãã
æ§é å®çŸ©ã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
typealias ArrayType = [KeyType] typealias DictionaryType = [KeyType: ValueType] var array = ArrayType() var dictionary = DictionaryType()
ããã¯ã説æãã2ã€ã®ããããã£ãšãæ¢åã®ã¿ã€ãã«æ°ããååãä»ãã2ã€ã®ã¿ã€ããšã€ãªã¢ã¹ã瀺ããŸãã ããã§ã¯ãããã¯ã¢ããã¢ã¬ã€ãšãã£ã¯ã·ã§ããªã®ããããã«ãã¢ã¬ã€ã®ãšã€ãªã¢ã¹ãšãã£ã¯ã·ã§ããªã®ã¿ã€ããæå®ããŸãã ã¿ã€ããšã€ãªã¢ã¹ã¯ãè€éãªã¿ã€ããååŸããã¯ããã«çãååãä»ããã®ã«æé©ãªæ¹æ³ã§ãã
åã®ä»£ããã«ãæ§é å®çŸ©ã®KeyTypeããã³ValueTypeåãã©ã¡ãŒã¿ãŒã䜿çšã§ããããšã«æ³šæããŠãã ããã é åã¯KeyTypesã®é åã§ãã ãã¡ãããKeyTypeãªã©ã®ã¿ã€ãã¯ãããŸããã 代ããã«ãSwiftã¯ããžã§ããªãã¯åã®ã€ã³ã¹ã¿ã³ã¹åäžã«ãããããã¿ã€ãã®é åºä»ãèŸæžãŠãŒã¶ãŒã®ããã«ãããæ±ããŸãã
ãã®æç¹ã§ãã³ã³ãã€ã©ãšã©ãŒã«æ°ä»ãã§ãããã
ã¿ã€ããKeytypeãã¯ãããã³ã«ãHashableãã«æºæ ããŠããŸãã
ããã¯ããªãã«ãšã£ãŠé©ããããããŸããã èŸæžã®å®è£ ãèŠãŠãã ããã
struct Dictionary<KeyType: Hashable, ValueType>
ããã¯ãKeyTypeã®åŸã®ãïŒHashableããé€ããŠãOrderedDictionaryã®å®çŸ©ã«éåžžã«äŒŒãŠããŸãã ã»ãã³ãã³ã®åŸã®Hashableã¯ãKeyTypeã«æž¡ãããåãHashableãããã³ã«ã«æºæ ããå¿ èŠãããããšã瀺ããŸãã ããã¯ããã£ã¯ã·ã§ããªããã®å®è£ ã®ããã«ããŒãããã·ã¥ã§ããå¿ èŠãããããã§ãã
ãã®æ¹æ³ã§ãžã§ããªãã¯åãã©ã¡ãŒã¿ãŒãå¶éããããšã¯éåžžã«äžè¬çã«ãªããŸããã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ããããã®å€ãã©ãåŠçããå¿ èŠããããã«å¿ããŠãEquatableãŸãã¯Printableãããã³ã«ã«é©åããããã«å€ã®ã¿ã€ããå¶éããããšãã§ããŸãã
OrderedDictionary.swiftãéããæ§é å®çŸ©ã次ã®ãã®ã«çœ®ãæããŸãã
struct OrderedDictionary<KeyType: Hashable, ValueType>
ããã¯ãOrderedDictionaryã®KeyTypeãHashableãšäžèŽããå¿ èŠãããããšã瀺ããŠããŸãã ããã¯ãKeyTypeãã©ã®ã¿ã€ãã«ãªã£ãŠããã¡ã€ã³èŸæžã®ããŒãšããŠåãå ¥ããããããšãæå³ããŸãã
ããã§ããã¡ã€ã«ã¯ãšã©ãŒãªãã§ã³ã³ãã€ã«ãããŸãïŒ
ããŒãæå³ããžã£ãº
å€ãè¿œå ã§ããªãå Žåã®èŸæžã®äœ¿çšã¯äœã§ããïŒ OrderedDictionary.swiftãéãã次ã®é¢æ°ãæ§é å®çŸ©ã«è¿œå ããŸãã
// 1 mutating func insert(value: ValueType, forKey key: KeyType, atIndex index: Int) -> ValueType? { var adjustedIndex = index // 2 let existingValue = self.dictionary[key] if existingValue != nil { // 3 let existingIndex = find(self.array, key)! // 4 if existingIndex < index { adjustedIndex-- } self.array.removeAtIndex(existingIndex) } // 5 self.array.insert(key, atIndex:adjustedIndex) self.dictionary[key] = value // 6 return existingValue }
ãããã¯ãã¹ãŠãæ°ããæ å ±ã«æ £ã芪ããã§ãããã§ãããã ãããã段éçã«èŠãŠã¿ãŸãããïŒ
- æ°ãããªããžã§ã¯ãã®æ¿å ¥ã«åœ¹ç«ã€ã¡ãœããinsertïŒ_ïŒforKeyïŒatIndexïŒã«ã¯ã3ã€ã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã§ããç¹å®ã®ããŒã®å€ãšã€ã³ããã¯ã¹ãããŒãšå€ã®ãã¢ãæ¿å ¥ã§ããŸãã ããã«ã¯ããããŸã§èŠãããšããªããããããªãããŒã¯ãŒãããããŸãïŒå€åããŸãã
- ãã®ããŒã«æ¢åã®å€ãæ¢ã«ååšããå Žåã¯ãæ¢åã®å€ãè¿ãèŸæžã€ã³ãã¯ãµãŒã«ããŒãåããŸãã ãã®æ¿å ¥ã¡ãœããã¯ããã£ã¯ã·ã§ããªã®updateValueãšåãåäœãæš¡å£ãããããããŒã®æ¢åã®å€ãä¿æããŸãã
- æ¢åã®å€ãããå Žåãã¡ãœããã䜿çšããå Žåã«ã®ã¿ããã®ããŒã®é åå ã®ã€ã³ããã¯ã¹ãæ€çŽ¢ãããŸãã
- æ¢åã®ããŒãæ¿å ¥ã€ã³ããã¯ã¹ã®åã«ããå Žåãæ¢åã®ããŒãåé€ããå¿ èŠããããããæ¿å ¥ã€ã³ããã¯ã¹ãèšå®ããå¿ èŠããããŸãã
- å¿ èŠã«å¿ããŠãé åãšèŸæžãæŽæ°ããå¿ èŠããããŸãã
- æåŸã«ãæ¢åã®å€ãè¿ããŸãã é¢æ°ãè¿œå ã®å€ãè¿ããããæ¢åã®å€ãååšããªãå¯èœæ§ãããããã
èŸæžã«å€ãè¿œå ã§ããããã«ãªã£ãã®ã§ãå€ãåé€ããã®ã¯ã©ãã§ããïŒ
OrderedDictionaryã®æ§é å®çŸ©ã«æ¬¡ã®é¢æ°ãè¿œå ããŸãã
// 1 mutating func removeAtIndex(index: Int) -> (KeyType, ValueType) { // 2 precondition(index < self.array.count, "Index out-of-bounds") // 3 let key = self.array.removeAtIndex(index) // 4 let value = self.dictionary.removeValueForKey(key)! // 5 return (key, value) }
ã³ãŒããã¹ãããããšã«ããäžåºŠèŠãŠã¿ãŸãããã
- ããã¯ãæ§é ã®å éšç¶æ ãå€æŽããé¢æ°ã§ããããããã£ãŠããã®ããã«èªèããŸãã removeAtIndexãšããååã¯ãArrayã®ã¡ãœããã«å¯Ÿå¿ããŠããŸãã å¿ èŠã«å¿ããŠãã·ã¹ãã ã©ã€ãã©ãªã®APIã®ãã©ãŒãªã³ã°ãæ€èšããããšããå§ãããŸãã ããã«ãããAPIã䜿çšããŠããéçºè ããã©ãããã©ãŒã äžã§æ°è»œã«æäœã§ããŸãã
- ãŸããã€ã³ããã¯ã¹ããã§ãã¯ããŠãé åå ã«ãããã©ããã確èªã§ããŸãã åºæ¬é åãã蚱容ç¯å²å€ã®ã¢ã€ãã ãåé€ããããšãããšãã©ã³ã¿ã€ã ãšã©ãŒãã¹ããŒãããããããã§ãã¯ã¯ãããå°ãåã«æ€åºããŸãã Claim-Cã§Objective-Cã®ã¹ããŒãã¡ã³ãã䜿çšããå¯èœæ§ããããŸãã assertã¯Swiftã§ãå©çšå¯èœã§ãããåææ¡ä»¶ãæ©èœããªããªã£ãå Žåã«ã¢ããªã±ãŒã·ã§ã³ãçµäºã§ããããã«ãçŸåšãæçµãã«ãã§åææ¡ä»¶ã䜿çšãããŠããŸãã
- 次ã«ãé åããå€ãåé€ããªãããæå®ãããã€ã³ããã¯ã¹ã®é åããããŒãååŸããŸãã
- 次ã«ããã®ããŒã®å€ãèŸæžããåé€ããŸããããã«ããã以åã«ååšããŠããå€ãè¿ãããŸãã èŸæžã«ã¯ãã®ããŒã®å€ãå«ãŸããŠããªãå¯èœæ§ããããããremoveValueForKeyã¯è¿œå ã®ãããªã¢ã«ãè¿ããŸãã ãã®å Žåããã£ã¯ã·ã§ããªã«è¿œå ã§ããã¡ãœããã¯ç¬èªã«äœæããæ¿å ¥ïŒ_ïŒ_ïŒforKeyïŒatIndex :)ã®ã¿ã§ããããããã£ã¯ã·ã§ããªã«ã¯ãã®ããŒã®å€ãå«ãŸããããšãããã£ãŠããŸãã ãããã£ãŠã䟡å€ãããããšãç¥ããªãããè¿œå ã®è³æãããã«å ¬éã§ããŸãã
- æåŸã«ãããŒãšå€ãã¿ãã«ã«è¿ããŸãã ããã¯ãæ¢åã®å€ãè¿ãremoveAtIndexé åãšremoveValueForKeyèŸæžã®åäœãšäžèŽããŠããŸãã
å€ãžã®ã¢ã¯ã»ã¹
ããã§ãã£ã¯ã·ã§ããªã«æžã蟌ãããšãã§ããŸããããã£ã¯ã·ã§ããªããèªã¿åãããšã¯ã§ããŸãã-ããã¯ããŒã¿æ§é ã«ã¯åœ¹ã«ç«ã¡ãŸããïŒ ããã§ãèŸæžããå€ãååŸã§ããã¡ãœãããè¿œå ããå¿ èŠããããŸãã
OrderedDictionary.swiftãéãã次ã®ã³ãŒããå®çŸ©æ§é ã«è¿œå ããé åãšå€æ°ã®å®£èšã®äžã§èŸæžããã€ã³ãããŸãã
var count: Int { return self.array.count }
ããã¯ãéåžžãã®ãããªããŒã¿æ§é ã«å¿ èŠãªããŒã¿ã§ãããé åºä»ããããèªåœã®æ°ã®èšç®ãããããããã£ã§ãã é åå ã®çªå·ã¯åžžã«é åºä»ããããèŸæžã®çªå·ãšäžèŽããããããã¹ãŠãåçŽã«ãªããŸã
次ã«ãèŸæžã®èŠçŽ ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã Swiftã§ã¯ã次ã®ããã«ã€ã³ããã¯ã¹æ§æã䜿çšããŠèŸæžã«ã¢ã¯ã»ã¹ããŸãã
let dictionary = [1: "one", 2: "two"] let one = dictionary[1] // Subscript
ããã§æ§æã«ç²ŸéããŸããããããããé åãšèŸæžã«äœ¿çšãããŠããããšãèŠãã ãã§ãããã ç¬èªã®ã¯ã©ã¹ãšæ§é ãã©ã®ããã«äœ¿çšããŸããïŒ å¹žããSwiftã䜿çšãããšãã«ã¹ã¿ã ã¯ã©ã¹ã«ã€ã³ããã¯ã¹åäœãç°¡åã«è¿œå ã§ããŸãã
æ§é å®çŸ©ã®äžéšã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
// 1 subscript(key: KeyType) -> ValueType? { // 2(a) get { // 3 return self.dictionary[key] } // 2(b) set { // 4 if let index = find(self.array, key) { } else { self.array.append(key) } // 5 self.dictionary[key] = newValue }
ãã®ã³ãŒãã®æ©èœã¯æ¬¡ã®ãšããã§ãã
- ããã¯ãã€ã³ããã¯ã¹ã®åäœãè¿œå ããã®ãšåãããã«æ©èœããfuncãŸãã¯varã®ä»£ããã«ãindexããŒã¯ãŒãã䜿çšãããŸãã ãã©ã¡ãŒã¿ãŒïŒãã®å Žåã¯ããŒïŒã¯ãè§æ¬åŒ§å ã«è¡šç€ºããããªããžã§ã¯ããå®çŸ©ããŸãã
- æ·»ãåã«ã¯ãèšç®ãããããããã£ãšåæ§ã«ã¢ã¯ã»ã¹æ¹æ³ãå«ããããšãã§ããŸãã ïŒaïŒgetããã³ïŒbïŒsetã¡ãœããã¯ããããã¢ã¯ã»ã¹æ¹æ³ãå®çŸ©ããããšã«æ³šæããŠãã ããã
- getã¡ãœããã¯ç°¡åã§ãããã®ããŒã®å€ã«ã€ããŠèŸæžãç §äŒããå¿ èŠããããŸãã èŸæžã®æ·»ãåã¯ãã§ã«è¿œå ã®ãããªã¢ã«ãè¿ããŠããããããã®ããŒã«å€ããªãããšã瀺ãããšãã§ããŸãã
- setã¡ãœããã¯ããè€éã§ãã ãŸããããŒãé åºä»ããããèŸæžã«æ¢ã«ååšãããã©ããã確èªããŸãã ååšããªãå Žåã¯ãã¢ã¬ã€ã«è¿œå ããå¿ èŠããããŸãã æ°ããããŒã¯é åã®æåŸã«ç§»åããããšããå§ãããŸãããã®ãããå€ãè¿œå ããŠé åã«è¿œå ããŸãã
- æåŸã«ãæå®ãããããŒã®èŸæžã«æ°ããå€ãè¿œå ããæé»çã«ååãä»ããããnewValueå€æ°ãä»ããŠæ°ããå€ã«æž¡ããŸãã
ããã§ãéåžžã®èŸæžã§ãããã®ããã«ãé åºä»ããããèŸæžã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãã ç¹å®ã®ããŒã®å€ãååŸã§ããŸãããé åã®ããã«ã€ã³ããã¯ã¹ã§ã¢ã¯ã»ã¹ããã®ã¯ã©ãã§ããïŒ é åºä»ãããããã£ã¯ã·ã§ããªã§ã©ã®ããã«æ©èœããããèŠãŠãã€ã³ããã¯ã¹ãä»ããŠèŠçŽ ã«ã¢ã¯ã»ã¹ããã®ãããã§ãããã
ã¯ã©ã¹ãšæ§é äœã¯ãããŸããŸãªã¿ã€ãã®åŒæ°ã«å¯ŸããŠè€æ°ã®ã€ã³ããã¯ã¹å®çŸ©ãæã€ããšãã§ããŸãã æ§é å®çŸ©ã®äžéšã«æ¬¡ã®é¢æ°ãè¿œå ããŸãã
subscript(index: Int) -> (KeyType, ValueType) { // 1 get { // 2 precondition(index < self.array.count, "Index out-of-bounds") // 3 let key = self.array[index] // 4 let value = self.dictionary[key]! // 5 return (key, value) } }
ããã¯ããã©ã¡ãŒã¿ã¿ã€ããIntã«ãªã£ãŠããããšãé€ããŠã以åã«è¿œå ããæ·»ãåã«äŒŒãŠããŸããããã¯ããããé åã®ã€ã³ããã¯ã¹ãåç §ããããã«äœ¿çšãããã®ã ããã§ãã ãã ããä»åã¯ãæå®ãããã€ã³ããã¯ã¹ãæ ŒçŽããã®ã¯OrderedDictionaryã§ãããããçµæã®åã¯ããŒãšå€ã®ã¿ãã«ã§ãã
ãã®ã³ãŒãã®ä»çµã¿ïŒ
- ãã®æ·»ãåã«ã¯ã²ãã¿ãŒã¡ãœããã®ã¿ããããŸãã é åºä»ããããèŸæžã®ãµã€ãºç¯å²ã«ããã€ã³ããã¯ã¹ãæåã«ãã§ãã¯ããããšã§ãåæ§ã«ã»ãã¿ãŒã¡ãœãããå®è£ ã§ããŸãã
- ã€ã³ããã¯ã¹ã¯é åå ã«ååšããå¿ èŠããããŸããããã«ãããé åºä»ããããèŸæžã®é·ãã決ãŸããŸãã åææ¡ä»¶ã䜿çšããŠãé åºä»ããããèŸæžã®å€éšã«ã¢ã¯ã»ã¹ããããšããããã°ã©ããŒã«èŠåããŸãã
- ããŒã¯ãé åããååŸããããšã§èŠã€ããããšãã§ããŸãã
- å€ã¯ãç¹å®ã®ããŒã®èŸæžããååŸããããšã§èŠã€ããããšãã§ããŸãã ç¹°ãè¿ããŸãããæ¡åŒµãããè¿œå ãããªã¢ã«ã®äœ¿çšã«æ³šæããŠãã ãããç¥ã£ãŠããããã«ãèŸæžã«ã¯é åå ã®ããŒã®å€ãå«ãŸããŠããå¿ èŠããããŸãã
- æåŸã«ãããŒãšå€ãå«ãã¿ãã«ãè¿ããŸãã
ã¿ã¹ã¯ïŒãã®ã€ã³ããã¯ã¹ã®ã»ãã¿ãŒãå®è£ ããŸãã åã®ã€ã³ããã¯ã¹å®çŸ©ã®ããã«ãã»ãããè¿œå ããŠããå®äºããŸãã
ãã®æç¹ã§ãKeyTypeãIntã®å Žåã¯ã©ããªãã®ãçåã«æããããããŸããã ãžã§ããªãã¯ã¹ã®å©ç¹ã¯ãIntãå«ãããŒãšããŠã®ä»»æã®ããã·ã¥ã¿ã€ãã®å ¥åã§ãã ãã®å Žåãã€ã³ããã¯ã¹ã¯ã©ã®ã€ã³ããã¯ã¹ã³ãŒãã䜿çšããããã©ã®ããã«ç¥ãã®ã§ããïŒ
ããã¯ãã³ã³ãã€ã©ãäœããã¹ãããç¥ãããã«ãããå€ãã®åæ å ±ãã³ã³ãã€ã©ã«æäŸããå¿ èŠãããå Žæã§ãã åã€ã³ããã¯ã¹ã«ã¯ç°ãªãæ»ãå€ã®åãããããšã«æ³šæããŠãã ããã ãããã£ãŠãããŒå€ã®ã¿ãã«ãèšå®ããããšããŠããå Žåãã³ã³ãã€ã©ã¯é åã®ãããªæ·»ãåã䜿çšããå¿ èŠãããããšãèªèããŸãã
ã·ã¹ãã ãã¹ã
ããã°ã©ã ãå®è¡ããŠãã³ã³ãã€ã«æ¹æ³ã䜿çšããã€ã³ããã¯ã¹ã¡ãœãããããã³OrdeââredDictionaryãå šäœãšããŠã©ã®ããã«æ©èœããããå®éšã§ããããã«ããŸãã
File \ New \ File ...ãã¯ãªãã¯ããiOS \ Source \ PlaygroundãéžæããŠãNextãã¯ãªãã¯ããŠãæ°ããPlaygroundãäœæããŸãã ODPlaygroundãšããååãä»ããŠã[äœæ]ãã¯ãªãã¯ããŸãã
OrderedDictionary.swiftãã³ããŒããŠãæ°ãããã¬ã€ã°ã©ãŠã³ãã«è²Œãä»ããŸãã æ®å¿µãªããããã®ã¬ãã¹ã³ãæžããŠããæç¹ã§ã¯ããµã€ãã¯ã¢ããªã±ãŒã·ã§ã³ã¢ãžã¥ãŒã«ã®ã³ãŒãããèŠããããšãã§ããªãããããããè¡ãå¿ èŠããããŸãã
æ³šïŒ ããã§å®è£ ãããŠããã³ããŒ/貌ãä»ãã¡ãœãããé€ããããã«ã¯åé¿çããããŸãã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãããã¬ãŒã ã¯ãŒã¯ã«ç§»åããå ŽåãKorin KrichãææããŠããããã«ãPlaygroundã¯ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããŸãã
次ã®ã³ãŒãããã¬ã€ã°ã©ãŠã³ãã«è¿œå ããŸãã
var dict = OrderedDictionary<Int, String>() dict.insert("dog", forKey: 1, atIndex: 0) dict.insert("cat", forKey: 2, atIndex: 1) println(dict.array.description + " : " + dict.dictionary.description) var byIndex: (Int, String) = dict[0] println(byIndex) var byKey: String? = dict[2] println(byKey)
ãµã€ãããŒïŒãŸãã¯è¡šç€º\ã¢ã·ã¹ã¿ã³ããšãã£ã¿ãŒ\ã¢ã·ã¹ã¿ã³ããšãã£ã¿ãŒã®è¡šç€ºïŒã§ãåºåå€æ°printlnïŒïŒã確èªã§ããŸãã
ãã®äŸã§ã¯ããã£ã¯ã·ã§ããªã«ã¯IntããŒããããŸããããã¯ãã³ã³ãã€ã©ã䜿çšããã€ã³ããã¯ã¹ã決å®ããå€æ°ã®ã¿ã€ããèæ ®ããããã§ãã byIndexã¯ïŒIntãStringïŒã¿ãã«ã§ãããããã³ã³ãã€ã©ã¯ãäºæ³ãããæ»ãå€ã®åã«äžèŽããæ·»åé åã¹ã¿ã€ã«ã®ã€ã³ããã¯ã¹ããŒãžã§ã³ã䜿çšããå¿ èŠãããããšãèªèããŠããŸãã
åäžã®byIndexãŸãã¯byKeyå€æ°ããããŒã¿åå®çŸ©ãåé€ããŠãã ããã ã³ã³ãã€ã©ãšã©ãŒã衚瀺ãããŸããããã¯ãã³ã³ãã€ã©ã䜿çšããæ·»ãåãèªèããŠããªãããšã瀺ããŸãã
ãã³ãïŒ åæšè«ãå®è¡ããã«ã¯ãã³ã³ãã€ã©ã¯åŒã®åãäžæã§ããå¿ èŠããããŸãã åŒæ°ã®ã¿ã€ããåãã§æ»ãå€ã®ã¿ã€ããç°ãªãè€æ°ã®ã¡ãœãããååšããå ŽåãåŒã³åºãåŽã®é¢æ°ã¯åºæã§ãªããã°ãªããŸããã Swiftã«ã¡ãœãããè¿œå ãããšãã¢ã»ã³ããªã«é倧ãªå€æŽãå ããããå¯èœæ§ãããããã泚æããŠãã ããïŒ
ãã¬ã€ã°ã©ãŠã³ãã§é åºä»ããããèŸæžãè©ŠããŠããããã©ã®ããã«æ©èœããããç解ããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã«æ»ãåã«ãè¿œå ããŠããåé€ããããŒãšã¿ã€ãã®å€ãå€æŽããŠã¿ãŠãã ããã
ããã§ã泚æããèŸæžã®èªã¿æžããã§ããŸãïŒ ããã¯ãããŒã¿æ§é ã®ç®¡çã«åœ¹ç«ã¡ãŸãã ããã§ãã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšãéå§ã§ããŸãïŒ
ç»åæ€çŽ¢ã®è¿œå
ããã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«æ»ããŸãããã
MasterViewController.swiftãéãã2ã€ã®@IBOutletsã®ããäžã«æ¬¡ã®å€æ°å®çŸ©ãè¿œå ããŸãã
var searches = OrderedDictionary<String, [Flickr.Photo]>()
ããã¯ããŠãŒã¶ãŒãFlickrããåãåã£ãæ€çŽ¢çµæãå«ãé åºä»ããããèŸæžã§ãªããã°ãªããŸããã ã芧ã®ãšãããæååãæ€çŽ¢æ¡ä»¶ãFlickr.Photoé åããŸãã¯Flickr APIããè¿ãããåçã衚瀺ãããŸããéåžžã®èŸæžã®å Žåãšåãæ¹æ³ã§ãããŒãšå€ãå±±æ¬åŒ§ã«åããããšã«æ³šæããŠãã ããããããã¯ããã®å®è£ ã§ã¯KeyTypeããã³ValueTypeåã®ãã©ã¡ãŒã¿ãŒã«ãªããŸãã
Flickr.Photoã¿ã€ãã«ããªãªããããã®ã¯ãªãããšæããããããŸãããããã¯ãåçãFlickrã¯ã©ã¹å ã§å®çŸ©ãããã¯ã©ã¹ã§ããããã§ãããã®éå±€ã¯Swiftã®éåžžã«äŸ¿å©ãªæ©èœã§ãããã¯ã©ã¹åãçãä¿ã¡ãªããåå空éãç¶æããã®ã«åœ¹ç«ã¡ãŸãã Flickrã¯ã©ã¹ã®å éšã§ã¯ãphotoã¯ã©ã¹ã«å±ããPhotoã®ã¿ã䜿çšã§ããŸããããã¯ãã³ã³ããã¹ããã³ã³ãã€ã©ãŒã«ãã®å 容ãäŒããããã§ãã
次ã«ãtableViewïŒ_ïŒnumberOfRowsInSection :)ãšããããŒãã«ãã¥ãŒããŒã¿ãœãŒã¹ã¡ãœãããèŠã€ããŠã次ã®ã³ãŒãã«å€æŽããŸãã
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.searches.count }
ãã®ã¡ãœããã¯ãããŒãã«ã®ã»ã«æ°ã瀺ãé åºä»ãèŸæžã䜿çšããããã«ãªããŸããã
次ã«ãããŒãã«ãã¥ãŒããŒã¿ãœãŒã¹ã¡ãœããtableViewïŒ_ïŒcellForRowAtIndexPath :)ãèŠã€ããŠã次ã®ããã«å€æŽããŸãã
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // 1 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell // 2 let (term, photos) = self.searches[indexPath.row] // 3 if let textLabel = cell.textLabel { textLabel.text = "\(term) (\(photos.count))" } return cell }
ãã®ã¡ãœããã§è¡ãããšã¯æ¬¡ã®ãšããã§ãã
- ãŸããdequeueReusableCellWithIdentifierãUITableViewCellã§ã¯ãªãAnyObjectïŒObjective-Cã®èå¥åïŒã«æ»ããããUITableViewãããã¥ãŒããã»ã«ãéžæããUITableViewCellã«çŽæ¥éä¿¡ããŸããããããå°æ¥ãAppleã¯APIãæžãçŽããŠããžã§ããªãã¯ãå©çšã§ããããã«ããŸãïŒ
- 次ã«ãäœæããã€ã³ããã¯ã¹ã®æ·»ãåã䜿çšããŠãæå®ããè¡ã®ããŒãšå€ãååŸããŸãã
- æåŸã«ãããã¹ããã»ã«ã®ãã¡ã»ããã«ã€ã³ã¹ããŒã«ããã»ã«ãè¿ããŸãã
ã§ã¯ããè©°ãç©ãã«ã€ããŠè©±ããŸããããUISearchBarDelegateæ¡åŒµæ©èœãèŠã€ããŠã次ã®ããã«åäžã®ã¡ãœãããå€æŽããŸãã
func searchBarSearchButtonClicked(searchBar: UISearchBar!) { // 1 searchBar.resignFirstResponder() // 2 let searchTerm = searchBar.text Flickr.search(searchTerm) { switch ($0) { case .Error: // 3 break case .Results(let results): // 4 self.searches.insert(results, forKey: searchTerm, atIndex: 0) // 5 self.tableView.reloadData() } } }
ãã®ã¡ãœããã¯ããŠãŒã¶ãŒã[æ€çŽ¢]ãã¿ã³ãã¯ãªãã¯ãããšåŒã³åºãããŸãããã®ã¡ãœããã§è¡ãããããšã¯æ¬¡ã®ãšããã§ãã
- 次ã«ãæ€çŽ¢æ¡ä»¶ãæ€çŽ¢ããŒã®ããã¹ããšããŠä»ããåç §ããFlickrã¯ã©ã¹ã䜿çšããŠãã®ã¯ãšãªãæ€çŽ¢ããŸããFlickrã®æ€çŽ¢æ¹æ³ã¯ãæ€çŽ¢ã¯ãšãªãšã¯ããŒãžã£ãŒã®äž¡æ¹ã䜿çšããŠãæ€çŽ¢ã®æåãŸãã¯å€±æãå®è¡ããŸããã¯ããŒãºã¯1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ã«é ŒããŸãããšã©ãŒãŸãã¯çµæã®ãªã¹ãã§ãã
- ãšã©ãŒã®å Žåããã®å åã¯è¡šç€ºãããŸãããããããããªãã¯ãããè¡ãããšãã§ããã®ã§ãããªããæããªãèŠåã衚瀺ãããŸããããªãç©äºãè€éã«ããã®ã§ãããããšã©ãŒã害ãåãŒããªãããšãSwiftã³ã³ãã€ã©ãŒã«éç¥ããã«ã¯ãã³ãŒããåæ¢ããå¿ èŠããããŸãã
- , SearchResults. , . , .
- , , .
ããããïŒããã§ãã¢ããªã±ãŒã·ã§ã³ãç»åãæ€çŽ¢ããŸãïŒ
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ããããã€ãã®æ€çŽ¢ãè¡ããŸãã次ã®ãããªãã®ã衚瀺ã
ããŸãããªã¹ãã®äžçªäžã«ãªãæ€çŽ¢ã®ãããããç¹°ãè¿ããŸãããããŠãããªãã¯åœŒãã©ã®ããã«ãªã¹ãã®äžçªäžã«æ»ãããèŠãã§ãããïŒ
æ€çŽ¢ã®äžã€ãã¯ãªãã¯ããŠã圌ãåçãèŠããªãããšã«æ°ã¥ããŸãããããä¿®æ£ããæãæ¥ãŸããïŒ
åçããã ããïŒ
MasterViewController.swiftãéããprepareForSegueã¡ãœãããèŠã€ããŸããããã次ã®ãã®ã«çœ®ãæããŸãã
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showDetail" { if let indexPath = self.tableView.indexPathForSelectedRow() { let (_, photos) = self.searches[indexPath.row] (segue.destinationViewController as DetailViewController).photos = photos } } }
ãã®å Žåãã»ã«ãäœæãããšããšåãæ€çŽ¢æ¹æ³ãé åºä»ããããèŸæžã«äœ¿çšãããŸããããŒïŒããŒã¯ãŒãã«ããæ€çŽ¢ïŒã¯äœ¿çšããŸãããããã®æ¹æ³ã§èªåã§æå®ããããšã«ãããã¿ãã«ã®ãã®éšåã¯ããŒã«ã«å€æ°ã«é¢é£ä»ããããªãããšã匷調ããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŠå®è¡ããæ€çŽ¢ãå®è¡ããŠããã¯ãªãã¯ããŸãã次ã®ãããªãã®ã衚瀺ãããŸãïŒ
ç«ïŒããªãã¯ãã®ãããªåã³ã®ä»£ããã«ãŽããŽã鳎ããããšæããŸããã
次ã¯ïŒ
ããã§ãšãããããŸãããžã§ããªãã¯ã«ã€ããŠå€ãã®ããšãåŠã³ãŸããïŒããã«ã玢åŒä»ããæ§é ãåææ¡ä»¶ãªã©ãä»ã®èå³æ·±ãããšãåŠã³ãŸããã
Genericsã«ã€ããŠè©³ããç¥ãããå Žåã¯ãSwiftãã¥ãŒããªã¢ã«ã®å šç« ãåç §ããå¿ èŠããããŸãã
ã³ãŒãã®éè€ãé¿ããç¹°ãè¿ã䜿çšããããã«ã³ãŒããæé©åããããã«ãå°æ¥ã®ã¢ããªã±ãŒã·ã§ã³ã§ãžã§ããªãã¯ã®å šæ©èœã䜿çšã§ããããšãé¡ã£ãŠããŸãã質åãã³ã¡ã³ããããå Žåã¯ããã©ãŒã©ã ã®ãã£ã¹ã«ãã·ã§ã³ã«åå ããŠãã ããïŒ