CSDNÒÆ¶¯½«³ÖÐøÎªÄúÓÅÑ¡ÒÆ¶¯¿ª·¢µÄ¾«»ªÄÚÈÝ£¬¹²Í¬Ì½ÌÖÒÆ¶¯¿ª·¢µÄ¼¼ÊõÈȵ㻰Ì⣬º¸ÇÒÆ¶¯Ó¦Óᢿª·¢¹¤¾ß¡¢Òƶ¯ÓÎÏ·¼°ÒýÇæ¡¢ÖÇÄÜÓ²¼þ¡¢ÎïÁªÍøµÈ·½·½ÃæÃæ¡£Èç¹ûÄúÏëͶ¸å¡¢²ÎÓëÄÚÈÝ·Ò빤×÷£¬»òѰÇó½ü½³±¨µÀ£¬Çë·¢ËÍÓʼþÖÁtangxy#csdn.net£¨Çë°Ñ#¸Ä³É@£©¡£
±¾Îijö×Ô£ºThoughtbot£¬×÷ÕߣºTony DiPasquale£¬ÒëÎijö×Ô£ºSwiftGG£¬ÒëÕߣºshanks
Æ»¹ûÍÆ³öµÄÃûΪ¡°Swift¡±µÄȫбà³ÌÓïÑÔ£¬ÕâÈÃÎÒÃǶÔδÀ´iOSºÍOS X¿ª·¢³äÂúÁËÆÚ´ýÓëÐË·Ü¡£ÈËÃǷ׷׿ªÊ¼Ê¹ÓÃXcode Beta1°æ±¾À´½øÐÐSwift¿ª·¢£¬µ«ÊǺܿì¾Í·¢ÏÖ½âÎöJSONÕâÒ»³£¼ûµÄ²Ù×÷ÔÚSwiftÖв¢²»ÈçÔÚObjectitve-CÖÐÄÇÑù¿ì½ÝºÍ·½±ã¡£
SwiftÊÇһ޲̬ÀàÐ͵ÄÓïÑÔ£¬ÕâÒâζÎÒÃDz»Äܼòµ¥µØ½«¶ÔÏó¸³Öµ¸øÒ»¸öÌØ¶¨ÀàÐ͵ıäÁ¿£¬²¢ÇÒÈñàÒëÆ÷ÏàÐÅÕâЩ¶ÔÏó¾ÍÊÇÎÒÃÇËùÉùÃ÷µÄÄÇÖÖÀàÐÍ¡£ÔÚSwiftµ±ÖУ¬±àÒëÆ÷»á½øÐмì²é£¬ÒÔÈ·±£ÎÒÃDz»»áÒâÍâµØ´¥·¢ÔËÐÐʱ´íÎó¡£ÕâʹµÃÎÒÃÇ¿ÉÒÔÒÀÀµ±àÒëÆ÷À´Ð´³öһЩÎÞBugµÄ´úÂ룬ͬʱÎÒÃDZØÐë×öÐí¶à¶îÍâµÄ¹¤×÷À´Ê¹±àÒëÆ÷²»±¨´í¡£ÔÚÕâÆªÎÄÕµ±ÖУ¬ÎÒ½«Ê¹Óú¯Êýʽ˼ÏëºÍ·ºÐÍÀ´Ì½ÌÖÈçºÎ±àдÒ×¶Á¸ßЧµÄ JSON ½âÎö´úÂë¡£
ÇëÇóÓû§(User)Ä£ÐÍÎÒÃÇÒª×öµÄʾÍÊǽ«ÍøÂçÇëÇó»ñµÃµÄÊý¾Ý½âÎö³ÉJSON¡£Ö®Ç°ÎÒÃÇһֱʹÓõÄÊÇNSJSONSerialization.JSONObjectWithData(NSData, Int, &NSError)·½·¨£¬Õâ¸ö·½·¨·µ»ØÒ»¸ö¿ÉÑ¡µÄJSONÊý¾ÝÀàÐÍ£¬Èç¹û½âÎö¹ý³Ì³ö´í»áµÃµ½NSErrorÀàÐ͵ÄÊý¾Ý¡£
ÔÚObjective-Cµ±ÖУ¬JSONµÄÊý¾ÝÀàÐÍÊÇÒ»¸ö¿ÉÒÔ°üº¬ÈÎºÎÆäËüÊý¾ÝÀàÐ͵ÄNSDictionaryÀàÐÍ¡£ ¶øÔÚSwiftµ±ÖУ¬ÐµÄ×ÖµäÀàÐÍÒªÇóÎÒÃDZØÐëÏÔʽָ¶¨ËüËù°üº¬µÄÊý¾ÝµÄÀàÐÍ¡£JSON Êý¾Ý±»Ö¸¶¨ÎªDictionary<String, AnyObject>ÀàÐÍ¡£
ÕâÀïʹÓÃAnyObjectµÄÔÒòÊÇJSONµÄÖµÓпÉÄÜΪString¡¢Double¡¢ Bool¡¢ Array¡¢ Dictionary»òÕßnull¡£µ±ÎÒÃÇʹÓÃJSONÀ´Éú³ÉÄ£ÐÍÊý¾Ýʱ£¬±ØÐë¶Ôÿһ¸ö´ÓJSON×ÖµäÖлñÈ¡µ½µÄÖµ½øÐÐÅжϣ¬ÒÔÈ·±£Õâ¸öÖµÓëÎÒÃÇÄ£ÐÍÖÐÊôÐÔµÄÀàÐÍÒ»Ö¡£
ÏÂÃæÎÒÃÇÀ´¿´Ò»¸öÓû§(user)µÄÄ£ÐÍ£º
struct User { let id: Int let name: String let email: String }È»ºó£¬À´¿´Ò»Ï¶Ե±Ç°Óû§µÄÇëÇóºÍÏìÓ¦´úÂ룺
func getUser(request: NSURLRequest, callback: (User) -> ()) { let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, urlResponse, error in var jsonErrorOptional: NSError? let jsonOptional: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &jsonErrorOptional) if let json = jsonOptional as? Dictionary<String, AnyObject> { if let id = json["id"] as AnyObject? as? Int { // ÔÚ beta5 ÖУ¬´æÔÚÒ»¸ö bug£¬ËùÒÔÎÒÃÇÊ×ÏÈҪǿÐÐת»»³É AnyObject? if let name = json["name"] as AnyObject? as? String { if let email = json["email"] as AnyObject? as? String { let user = User(id: id, name: name, email: email) callback(user) } } } } } task.resume() }ÔÚÒ»³¤´®µÄif-letÓï¾äÖ®ºó£¬ÎÒÃÇÖÕÓÚÄõ½User¶ÔÏ󡣿ÉÒÔÏëÏóһϣ¬Èç¹ûÒ»¸öÄ£Ð͵ÄÊôÐԺܶ࣬ÕâЩ´úÂë»áÓжà³ó¡£²¢ÇÒ£¬ÕâÀïÎÒÃÇûÓнøÐдíÎó´¦Àí£¬ÕâÒâζ×Å£¬Ö»ÒªÆäÖÐÒ»²½³ö´íÎÒÃǾͻñÈ¡²»µ½ÈκÎÊý¾Ý¡£×îºó²¢ÇÒ×îÖØÒªµÄÒ»µãÊÇ£¬ÎÒÃDZØÐë¶Ôÿ¸öÐèÒª´ÓÍøÂç API ÖлñÈ¡µÄÄ£ÐÍдһ±éÀàËÆÉÏÃæÕâÑùµÄ´úÂ룬Õ⽫»áµ¼ÖºܶàÖØ¸´´úÂë¡£
ÔÚ¶Ô´úÂë½øÐÐÖØ¹¹Ö®Ç°£¬ÈÃÎÒÃÇÏȶÔJSONµÄ¼¸ÖÖÀàÐͶ¨Òå±ðÃû£¬ÒÔʹ֮ºóµÄ´úÂë¿´ÆðÀ´¸ü¼ò½à¡£
typealias JSON = AnyObject typealias JSONDictionary = Dictionary<String, JSON> typealias JSONArray = Array<JSON>ÖØ¹¹£ºÌí¼Ó´íÎó´¦ÀíÊ×ÏÈ£¬ÎÒÃǽ«Í¨¹ýѧϰµÚÒ»¸öº¯Êýʽ±à³ÌµÄ¸ÅÄEither<A, B>ÀàÐÍ£¬À´¶Ô´úÂë½øÐÐÖØ¹¹£¬ÒÔʹÆäÄܽøÐдíÎó´¦Àí¡£Õâ¿ÉÒÔʹ´úÂëÔÚÕýÈ·µÄÇé¿öÏ·µ»ØÓû§¶ÔÏ󣬶øÔÚ³ö´íʱ·µ»ØÒ»¸ö´íÎó¶ÔÏó¡£ÔÚSwiftµ±ÖпÉÒÔʹÓÃÈçÏ·½·¨À´ÊµÏÖEither<A, B> £º
enum Either<A, B> { case Left(A) case Right(B) }ÎÒÃÇ¿ÉÒÔʹÓà Either<NSError, User> ×÷Ϊ´«Èë»Øµ÷µÄ²ÎÊý£¬ÕâÑùµ÷ÓÃÕß±ã¿ÉÒÔÖ±½Ó´¦Àí½âÎö¹ýµÄUser¶ÔÏó»òÕß´íÎó¡£
func getUser(request: NSURLRequest, callback: (Either<NSError, User>) -> ()) { let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, urlResponse, error in // Èç¹ûÏìÓ¦·µ»Ø´íÎó£¬ÎÒÃǽ«°Ñ´íÎó·¢Ë͸ø»Øµ÷ if let err = error { callback(.Left(err)) return } var jsonErrorOptional: NSError? let jsonOptional: JSON! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &jsonErrorOptional) // Èç¹ûÎÒÃDz»ÄܽâÎö JSON£¬¾Í½«·¢ËÍ»ØÈ¥Ò»¸ö´íÎó if let err = jsonErrorOptional { callback(.Left(err)) return } if let json = jsonOptional as? JSONDictionary { if let id = json["id"] as AnyObject? as? Int { if let name = json["name"] as AnyObject? as? String { if let email = json["email"] as AnyObject? as? String { let user = User(id: id, name: name, email: email) callback(.Right(user)) return } } } } // Èç¹ûÎÒÃDz»ÄܽâÎöËùÓеÄÊôÐÔ£¬¾Í½«·¢ËÍ»ØÈ¥Ò»¸ö´íÎó callback(.Left(NSError())) } task.resume() }
¡¡