Swift
2 ´íÎó´¦Àí¼ò½é
throws ¹Ø¼ü×ÖºÍÒì³£´¦Àí»úÖÆÊÇ Swift 2 ÖÐмÓÈëµÄÖØÒªÌØÐÔ¡£Apple Ï£Íûͨ¹ýÔÚÓïÑÔ²ãÃæ¶ÔÒì³£´¦ÀíµÄÁ÷³Ì½øÐй淶ºÍͳһ£¬À´ÈôúÂë¸ü¼Ó°²È«£¬Í¬Ê±Èÿª·¢Õß¿ÉÒÔ¸ü¼Ó¼°Ê±¿É¿¿µØ´¦ÀíÕâЩ´íÎó¡£Swift
2 ÖÐËùÓеÄͬ²½ Cocoa API µÄ NSError ¶¼ÒѾ±» throw ¹Ø¼ü×ÖÈ¡´ú£¬¾Ù¸öÀý×Ó£º
Çåµ¥ 1. ÔÚÎļþ²Ù×÷Öи´ÖÆÎļþµÄ API ÔÚ Swift 1 ÖÐʹÓõÄÊÇºÍ Objective-C ÀàËÆµÄ
NSError Ö¸Õ뷽ʽ¡£
func copyItemAtPath(_ srcPath: String, toPath dstPath: String, error: NSErrorPointer) |
Çåµ¥ 2. ¶øÔÚ Swift 2 ÖУ¬±äΪÁË throws¡£
func copyItemAtPath(_ srcPath: String, toPath dstPath: String) throws |
Çåµ¥ 3. ʹÓÃʱ£¬Swift 1 ÖÐÎÒÃÇÐèÒª´´½¨²¢´«Èë NSError
µÄÖ¸Õ룬ÔÚ·½·¨µ÷Óúó¼ì²éÖ¸ÕëµÄÄÚÈÝ£¬À´ÅжÏÊÇ·ñ³É¹¦¡£
let fileManager = NSFileManager.defaultManager() var error: NSError? fileManager.copyItemAtPath(srcPath, toPath: dstPath, error: &error) if error != nil { // ·¢ÉúÁË´íÎó } else { // ¸´ÖƳɹ¦ } |
ÔÚʵ¼ùÖУ¬ÒòΪÕâ¸ö API ½ö»áÔÚ¼«ÆäÌØ¶¨µÄÌõ¼þÏ£¨±ÈÈç´ÅÅ̿ռ䲻×㣩»á³ö´í£¬ËùÒÔ¿ª·¢ÕßΪÁË·½±ã£¬ÓÐʱ»áÖ±½Ó´«Èë
nil À´ºöÊÓµôÕâ¸ö´íÎó¡£
Çåµ¥ 4. ºöÂÔ´íÎó
let fileManager = NSFileManager.defaultManager() // ²»¹ØÐÄÊÇ·ñ·¢Éú´íÎó fileManager.copyItemAtPath(srcPath, toPath: dstPath, error: nil) |
ÕâÖÖ×ö·¨ÎÞÐÎÖнµµÍÁËÓ¦ÓõĿɿ¿ÐÔÒÔ¼°´Ó´íÎóÖлָ´µÄÄÜÁ¦¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬Swift 2
ÖÐÔÚ±àÒëÆ÷²ã¼¶¾Í¶Ô throws ½øÐÐÁËÏÞ¶¨¡£±»±ê¼ÇΪ throws µÄ API£¬ÎÒÃÇÐèÒªÍêÕûµÄ try
catch À´²¶»ñ¿ÉÄܵÄÒì³££¬·ñÔòÎÞ·¨±àÒëͨ¹ý¡£
Çåµ¥ 5. ±àÒëʧ°Ü
let fileManager = NSFileManager.defaultManager() do { try fileManager.copyItemAtPath(srcPath, toPath: dstPath) } catch let error as NSError { // ·¢ÉúÁË´íÎó print(error.localizedDescription) } |
¶ÔÓÚ·Ç Cocoa ¿ò¼ÜµÄ API£¬ÎÒÃÇÒ²¿ÉÒÔͨ¹ýÉùÃ÷ ErrorType ²¢ÔÚ³ö´íʱ½øÐÐ throw
²Ù×÷¡£ÕâΪ´íÎó´¦ÀíÌṩÁËͳһµÄ´¦Àí³ö¿Ú£¬ÓÐÒæÓÚÌá¸ßÓ¦ÓÃÖÊÁ¿¡£
throws ¼¼ÊõÄÚÄ»
throws ¹Ø¼ü×Ö¾¿¾¹×öÁËЩʲô£¬ÔÚ Swift ¿ªÔ´Ö®Ç°£¬ÎÒÃÇ¿ÉÒÔÓÃÉÔ΢µ×²ãÒ»µãµÄÊÖ·¨À´½øÐÐһЩ̽Ë÷¡£
Swift ±àÒëÆ÷£¬SIL ¼°»ã±à
ËùÓÐµÄ Swift Ô´Îļþ¶¼Òª¾¹ý Swift ±àÒëÆ÷±àÒëºó²ÅÄÜÖ´ÐС£Swift ±àÒë¹ý³Ì×ñѷdz£¾µäµÄ
LLVM ±àÒë¼Ü¹¹£º±àÒëÆ÷ǰ¶ËÊ×ÏÈ¶Ô Swift Ô´Âë½øÐдʷ¨·ÖÎöºÍÓï·¨·ÖÎö£¬Éú³É Swift ³éÏóÓï·¨Ê÷£¨AST£©£¬È»ºó´Ó
AST Éú³É Swift ÖмäÓïÑÔ£¨Swift Intermediate Language£¬SIL£©£¬½ÓÏÂÀ´
SIL ±»·Òë³ÉͨÓÃµÄ LLVM Öмä±íÊö£¨LLVM Intermediate Representation,
LLVM IR£©£¬×îºóͨ¹ý±àÒëÆ÷ºó¶ËµÄÓÅ»¯£¬µÃµ½»ã±àÓïÑÔ¡£Õû¸ö¹ý³Ì¿ÉÒÔÓÃÏÂÃæµÄ¿òͼÀ´±íʾ£º

Swift ±àÒëÆ÷ÌṩÁ˷dz£Áé»îµÄÃüÁîÐй¤¾ß£ºswiftc£¬Õâ¸öÃüÁîÐй¤¾ß¿ÉÒÔÔËÐÐÔÚ²»Í¬Ä£Ê½Ï£¬ÎÒÃÇͨ¹ý¿ØÖÆÃüÁîÐвÎÊýÄÜ»ñÈ¡µ½
Swift Ô´Âë±àÒëµ½¸÷¸ö½×¶ÎµÄ½á¹û¡£Ê¹Óà swiftc --help ÎÒÃÇÄܵÃÖª¸÷¸öģʽµÄʹÓ÷½·¨£¬ÕâÆªÎÄÕ»áÓõ½ÏÂÃæ¼¸¸öģʽ£¬ËüÃÇ·Ö±ð½«
Swift Ô´´úÂë±àÒëΪ SIL£¬LLVM IR ºÍ»ã±àÓïÑÔ¡£
Çåµ¥ 6. sh
> swiftc --help ... MODES: -emit-sil Emit canonical SIL file(s) -emit-ir Emit LLVM IR file(s) -emit-assembly Emit assembly file(s) (-S) ... |
ÔÚ Swift ¿ªÔ´Ö®Ç°£¬½«Ô´Âë±àÒëµ½¸÷¸ö½×¶ÎÊÇ̽Ë÷ Swift ÔÀíºÍʵÏÖ·½Ê½µÄÖØÒª·½Ê½¡£ÎÒÃǽÓÏÂÀ´½«»á·ÖÎöÒ»¶Î¼òµ¥µÄ
throw ´úÂ룬À´¿´¿´ Swift µÄÒì³£»úÖÆµ½µ×ÊÇÈçºÎÔË×÷µÄ¡£
throw£¬try£¬catch Éî²ã½âÎö ΪÁ˱£³ÖÎÊÌâµÄ¼òµ¥£¬ÎÒÃǶ¨ÒåÒ»¸ö×î¼òµ¥µÄ ErrorType
²¢ÓÃÒ»¸ö·½·¨À´½«ÆäÅ׳ö£¬Ô´´úÂëÈçÏ¡£
Çåµ¥ 7. ¶¨Òå ErrorType
// throw.swift enum MyError: ErrorType { case SampleError } func throwMe(shouldThrow: Bool) throws -> Bool { if shouldThrow { throw MyError.SampleError } return true } |
Çåµ¥ 8. ʹÓà swiftc ½«Æä±àÒëΪ SIL¡£
swiftc -emit-sil -O -o ./throw.sil ./throw.swift |
Çåµ¥ 9. ÔÚÊä³öÎļþÖУ¬¿ÉÒÔÕÒµ½ throwMe µÄ¶ÔÓ¦ Swift ÖмäÓïÑÔ±íÊö¡£
// throw.throwMe (Swift.Bool) throws -> Swift.Bool sil hidden @_TF5throw7throwMeFzSbSb : $@convention(thin) (Bool) -> (Bool, @error ErrorType) { bb0(%0 : $Bool): debug_value %0 : $Bool // let shouldThrow // id: %1 %2 = struct_extract %0 : $Bool, #Bool.value // user: %3 cond_br %2, bb1, bb2 // id: %3
bb1: // Preds: bb0
...
throw %4#0 : $ErrorType // id: %7
bb2: // Preds: bb0
...
return %9 : $Bool // id: %10
} |
_TF5throw7throwMeFzSbSb ÊÇ throwMe ·½·¨ Mangling
ÒÔºóµÄÃû×Ö¡£ÔÚÈ¥µôһЩÔëÒôºó£¬ÎÒÃÇ¿ÉÒÔ½«Õâ¸ö·½·¨µÄÇ©ÃûµÈЧ¿´×÷¡£
Çåµ¥ 10. throwMe ·½·¨
throwMe(shouldThrow: Bool) -> (Bool, ErrorType) |
ËüÆäʵÊÇ·µ»ØµÄÊÇÒ»¸ö (Bool, ErrorType) µÄ¶àÔª×é¡£ºÍÒ»°ãµÄ¶àÔª×鲻ͬµÄÊÇ£¬µÚ¶þ¸öÔªËØ
ErrorType ±»Ò»¸ö @error ÐÞÊÎÁË¡£Õâ¸öÐÞÊÎÈöàÔª×é¾ßÓÐÁË¡°ÅÅËûÐÔ¡±£¬Ò²¾ÍÊÇÖ»Òª¶àÔª×éµÄµÚÒ»¸öÔªËØ±»·µ»Ø¼´¿É£ºÔÚÌõ¼þ·ÖÖ§
bb2£¨Ò²¼´Ã»ÓÐÅ׳öÒì³£µÄÕý³£·ÖÖ§£©ÖУ¬½öÖ»ÓÐ Bool Öµ±»·µ»ØÁË¡£¶ø¶ÔÓÚ·¢Éú´íÎóÐèÒªÅ׳öµÄ´¦Àí£¬SIL
²ãÃæ»¹²¢Ã»ÓоßÌåʵÏÖ£¬Ö»ÊÇÉú³ÉÁ˶ÔÓ¦µÄ´íÎóö¾Ù¶ÔÏó£¬È»ºó¶ÔÆäµ÷ÓÃÁË throw ÃüÁî¡£
Õâ¾ÍÊÇ˵£¬ÎÒÃÇÏëҪ̽Ë÷ throw µÄ»°£¬»¹ÐèÒª¸üÉîÈëÒ»²ã¡£
Çåµ¥ 11. Óà swiftc ½«Ô´´úÂë±àÒëΪ LLVM IR
swiftc -emit-ir -O -o ./throw.ir ./throw.swift |
Çåµ¥ 12. ½á¹ûÖÐ throwMe µÄ¹Ø¼ü²¿·Ö
define hidden i1 @_TF5throw7throwMeFzSbSb(i1, %swift.refcounted* nocapture readnone, %swift.error** nocapture) #0 {
} |
ÕâÊÇÎÒÃǷdz£ÊìϤµÄÐÎʽ£¬²ÎÊýÖÐµÄ swift.error**ºÍ Swift 1 ÒÔ¼° Objective-C
ÖÐʹÓà NSError Ö¸ÕëÀ´»ñÈ¡ºÍ´æ´¢´íÎóµÄ×ö·¨ÊÇÒ»Öµġ£ÔÚʾÀýµÄÕâÖÖÇé¿öÏ£¬LLVM ºó¶ËÕë¶Ô swift.error
½øÐÐÁ˶îÍâ´¦Àí¡£
Çåµ¥ 13. ×îÖյõ½µÄ»ã±àÂëαÂë (ÔÚδÆôÓà -O ÓÅ»¯µÄÌõ¼þÏÂ)¡£
int __TF5throw7throwMeFzSbSb(int arg0) { rax = arg0; var_8 = rdx; if ((rax & 0x1) == 0x0) { rax = 0x1; } else { rax = swift_allocError(0x1000011c8, __TWPO5throw7MyErrorSs9ErrorTypeS_); var_18 = rax; swift_willThrow(rax); rax = var_8; *rax = var_18; } return rax; } |
º¯Êý×îÖյķµ»ØÊÇÒ»¸ö int£¬ËüÓпÉÄÜÊÇÒ»¸öʵ¼ÊµÄÕûÊýÖµ£¬Ò²ÓпÉÄÜÊÇÒ»¸öÖ¸Ïò´íÎóµØÖ·µÄÖ¸Õë¡£ÕâºÍ Swift
1 Öд«Èë NSErrorPointer À´´æ´¢´íÎóÖ¸ÕëµØÖ·ÓÐÃ÷ÏÔ²»Í¬£ºÊ×ÏÈÖ±½ÓʹÓ÷µ»ØÖµÎÒÃǾͿÉÒÔÅжϵ÷ÓÃÊÇ·ñ³öÏÖ´íÎ󣬶ø²»±ØÊ¹ÓöîÍâµÄ¿Õ¼ä½øÐд洢£»Æä´ÎÕû¸ö¹ý³ÌÖÐûÓÐʹÓõ½
NSError »òÕß Objective-C Runtime µÄÈκÎÄÚÈÝ£¬ÔÚÐÔÄÜÉÏÒªÓÅÓÚ´«Í³µÄ´íÎó´¦Àí·½Ê½¡£
ÎÒÃÇÔÚÁ˽âÁË throw µÄµ×²ã»úÀíºó£¬¶ÔÓÚ try catch ´úÂë¿éµÄÀí½â×ÔȻҲ¾ÍË®µ½Çþ³ÉÁË¡£
Çåµ¥ 14. ¼ÓÈëÒ»¸ö try catch ºóµÄ SIL Ïà¹Ø²¿·Ö
try_apply %15(%16) : $@convention(thin) (Bool) -> (Bool, @error ErrorType), normal bb1, error bb9 // id: %17
bb1(%18 : $Bool):
...
bb9(%80 : $ErrorType):
|
ÆäËû²ã¼¶µÄʵÏÖÒ²Óë´ËÀàËÆ£¬¶¼ÊǶԷµ»ØÖµ½øÐÐÀàÐÍÅжϣ¬È»ºó½øÈ벻ͬµÄÌõ¼þ·ÖÖ§½øÐд¦Àí¡£
ErrorType ºÍ NSError throw Óï¾äµÄ×÷ÓöÔÏóÊÇÒ»¸öʵÏÖÁË ErrorType
½Ó¿ÚµÄÖµ£¬±¾½Ú½«Ì½ÌÖ ErrorType ±³ºóµÄÄÚÈÝ£¬ÒÔ¼° NSError ÓëËüµÄ¹ØÏµ¡£
Çåµ¥ 15. ÔÚ Swift ¹«¿ªµÄ±ê×¼¿âÖУ¬ErrorType ½Ó¿Ú²¢Ã»Óй«¿ªµÄ·½·¨
public protocol ErrorType { } |
Çåµ¥ 16. Õâ¸ö½Ó¿ÚÓÐÒ»¸ö extension£¬µ«ÊÇҲûÓй«¿ªµÄÄÚÈÝ£º
Çåµ¥ 17. ÎÒÃÇ¿ÉÒÔͨ¹ýʹÓà LLDB µÄÀàÐͼìË÷À´»ñÈ¡¹ØÓÚÕâ¸ö½Ó¿ÚµÄ¸ü¶àÐÅÏ¢¡£ÔÚµ÷ÊÔÆ÷ÖÐÔËÐÐ type
lookup ErrorType£º
(lldb) type lookup ErrorType protocol ErrorType { var _domain: Swift.String { get } var _code: Swift.Int { get } } extension ErrorType { var _domain: Swift.String { get {} } } |
¿ÉÒÔ¿´µ½Õâ¸ö½Ó¿Úʵ¼ÊÉÏÐèҪʵÏÖÁ½¸öÊôÐÔ£ºdomain ÃèÊö´íÎóµÄËùÊôÓò£¬code ±ê¼Ç¾ßÌåµÄ´íÎóºÅ£¬ÕâºÍ´«Í³µÄ
NSError Öж¨ÒåÒ»¸ö´íÎóËùÐèÒªµÄÄÚÈÝÊÇÒ»Öµġ£ÊÂʵÉÏ NSError ÔÚ Swift 2 ÖÐҲʵÏÖÁË
ErrorType ½Ó¿Ú£¬Ëü¼òµ¥µØ·µ»Ø´íÎóµÄÓòºÍ´íÎó´úÂëÐÅÏ¢£¬ÕâÊÇ Swift 1 µ½ 2 µÄ´íÎó´¦ÀíÏà¹Ø
API ת»»µÄ¼æÈÝÐԵı£Ö¤¡£
ËäÈ» Cocoa/CocoaTouch ¿ò¼ÜÖÐµÄ throw API Å׳öµÄ¶¼ÊÇ NSError£¬µ«ÊÇÓ¦Óÿª·¢Õ߸üΪ³£ÓõıíÊö´íÎóµÄÀàÐÍÓ¦¸ÃÊÇ
enum£¬ÕâÒ²ÊÇ Apple ¶ÔÓÚ throw µÄÍÆ¼öÓ÷¨¡£¶ÔÓÚʵÏÖÁË ErrorType µÄ enum
ÀàÐÍ£¬Æä´íÎó´úÂ뽫¸ù¾Ý enum ÖÐ case ÉùÃ÷µÄ˳Ðò´Ó 0 ¿ªÊ¼±àºÅ£¬¶ø´íÎóÓòµÄÃû×Ö¾ÍÊÇËüµÄÀàÐÍÈ«Ãû
(Module Ãû + ÀàÐÍÃû)£º
Çåµ¥ 18. ErrorType
MyError.InvalidUser._code: 0 MyError.InvalidUser._domain: ModuleName.MyError
MyError.InvalidPassword._code: 1
MyError.InvalidPassword._domain: ModuleName.MyError |
ÕâËäȻΪ°´ÕÕ´íÎóºÅÀ´´¦Àí´íÎóÌṩÁË¿ÉÄÜÐÔ£¬µ«ÊÇÎÒÃÇÔÚʵ¼ùÖÐÓ¦µ±¾¡Á¿ÒÀÀµ enum case ¶ø·Ç´íÎóºÅÀ´¶Ô´íÎó½øÐбæ±ð£¬Õâ¿ÉÒÔÌá¸ßÎȶ¨ÐÔ£¬Í¬Ê±½µµÍά»¤µÄѹÁ¦¡£³ýÁË
enum ÒÔÍ⣬struct ºÍ class Ò²ÊÇ¿ÉÒÔʵÏÖ ErrorType ½Ó¿Ú£¬²¢×÷Ϊ±» throw
µÄ¶ÔÏóµÄ¡£ÔÚʹÓÃ·Ç enum ÖµÀ´±íʾ´íÎóµÄʱºò£¬ÎÒÃÇ¿ÉÄÜÐèÒªÏÔʽµØÖ¸¶¨ _code ºÍ _domain£¬ÒÔÇø·Ö²»Í¬µÄ´íÎó¡£
throws µÄһЩʵ¼ù
Òì²½²Ù×÷ÖеÄÒì³£´¦Àí
´øÓÐ throw µÄ·½·¨ÏÖÔÚÖ»Äܹ¤×÷ÔÚͬ²½ API ÖУ¬ÕâÊÜÏÞÓÚÒì³£Å׳ö·½·¨µÄ»ù±¾Ë¼Ïë¡£Ò»¸ö¿ÉÒÔÅ׳öµÄ·½·¨Êµ¼ÊÉÏ×öµÄÊÂÇéÊÇÖ´ÐÐÒ»¸ö±Õ°ü£¬½Ó×ÅÑ¡Ôñ·µ»ØÒ»¸öÖµ»òÕßÊÇÅ׳öÒ»¸öÒì³£¡£Ö±½ÓʹÓÃÒ»¸ö
throw ·½·¨£¬ÎÒÃÇÎÞ·¨ÔÚ·µ»Ø»òÅ׳ö֮ǰÒì²½µØÖ´ÐвÙ×÷²¢¸ù¾Ý²Ù×÷µÄ½á¹ûÀ´¾ö¶¨·½·¨ÐÐΪ¡£Òª¸Ä±äÕâÒ»µã£¬ÀíÂÛÉÏÎÒÃÇ¿ÉÒÔͨ¹ý½«±Õ°üµÄÖ´ÐкͶԽá¹ûµÄ²Ù×÷½øÐзÖÀ룬À´´ïµ½¡°Òì²½Å׳ö¡±µÄЧ¹û¡£
Çåµ¥ 19. ¼ÙÉèÓÐÒ»¸öͬ²½·½·¨¿ÉÒÔÅ׳öÒì³££º
func syncFunc<A, R>(arg: A) throws -> R |
Çåµ¥ 20. ͨ¹ýΪÆäÌí¼ÓÒ»´Îµ÷Ó㬿ÉÒÔ½«±Õ°üÖ´Ðв¿·ÖºÍ½á¹ûÅжϼ°·µ»Ø²¿·Ö·ÖÀ룺
func syncFunc<A, R>(arg: A)() throws -> R |
Çåµ¥ 21. ÕâÏ൱ÓÚ½«ÔÀ´µÄ·½·¨¸ÄдΪ£º
func syncFunc<A, R>(arg: A) -> (Void throws -> R) |
ÕâÑù£¬µ¥´Î¶Ô syncFunc µÄµ÷Óý«·µ»ØÒ»¸ö Void throws -> R ÀàÐ͵ķ½·¨£¬ÕâʹÎÒÃÇÓлú»áÖ´ÐдúÂë¶ø²»ÊÇÖ±½Ó·µ»Ø»òÅ׳ö¡£ÔÚÖ´ÐÐ
syncFunc ·µ»Øºó£¬ÎÒÃÇ»¹ÐèÒª¶ÔÆä½á¹ûÓà try À´½øÐÐÅжÏÊÇ·ñÅ׳öÒì³£¡£
Çåµ¥ 22. ÀûÓÃÕâ¸öÌØµã£¬ÎÒÃǾͿÉÒÔ½«Õâ¸öͬ²½µÄÅ׳ö·½·¨¸ÄдΪÒì²½ÐÎʽ£º
func asyncFunc<A, R>(arg: A, callback: (Void throws -> R) -> Void) { // ´¦Àí²Ù×÷ let result: () throws -> R = { // ¸ù¾Ý½á¹ûÅ׳öÒì³£»òÕßÕý³£·µ»Ø } return callback(result) }
// µ÷ÓÃ
asyncFunc(arg: someArg) { (result) -> Void
in
do {
let r = try result()
// Õý³£·µ»Ø
} catch _ {
// ³öÏÖÒì³£
}
} |
ÈÆÁËÒ»´ó¸öȦ×Ó£¬ÎÒÃÇ×îºó·¢ÏÖÕâô×ö±¾ÖÊÉÏÆäʵºÍ¼òµ¥µØÊ¹Óà Result<T, E> À´±íʾÒì²½·½·¨µÄ½á¹û²¢Ã»Óб¾ÖÊÇø±ð£¬·´¶øÔö¼ÓÁË´úÂëÔĶÁºÍÀí½âµÄÄѶȣ¬Ò²ÆÆ»µÁË
Swift Òì³£»úÖÆÔ±¾µÄÉè¼ÆÒâͼ£¬Æäʵ²¢²»ÊÇ¿ÉÈ¡µÄÑ¡Ïî¡£³ý¿ªÄ³Ð©·Ç³£ÌØÊâµÄÓÃÀýÍ⣬¶ÔÓÚÒì²½ API ÏÖÔÚ²¢²»ÊʺÏʹÓÃ
throw À´½øÐдíÎóÅжϡ£
Òì³£´¦ÀíµÄ²âÊÔ
ÔÚ XCTest ÖÐÔÝʱ»¹Ã»ÓÐÖ±½Ó¶Ô Swift 2 Òì³£´¦Àí½øÐвâÊԵķ½·¨£¬Èç¹ûÏëÒª²âÊÔij¸öµ÷ÓÃÓ¦µ±/²»Ó¦µ±Å׳öij¸öÒì³£µÄ»°£¬ÎÒÃÇ¿ÉÒÔ¶Ô
XCTest ¿ò¼ÜµÄ·½·¨½øÐÐһЩ¶îÍ⵫ºÜ¼òµ¥°ü×°£¬´«Èë block ²¢ÔËÐУ¬È»ºóÔÚ try ¿é»òÊÇ catch
¿éÄÚ½øÐÐ XCTAssert µÄ¶ÏÑÔ¼ì²â¡£ÔÚ Apple ¿ª·¢ÕßÂÛ̳ÓйØÓÚÕâ¸öÎÊÌâµÄ¸üÏêϸµÄÌÖÂÛ£¬ÍêÕûµÄʾÀý´úÂëºÍʹÓÃÀý×Ó¿ÉÒÔÔÚÕâÀïÕÒµ½¡£
ÀàÐͰ²È«µÄÒì³£Å׳ö
Swift 2 ÖÐÒì³£ÁíÒ»¸öÑÏÖØµÄ²»×ãÊÇÀàÐͲ»°²È«¡£throw Óï¾ä¿ÉÒÔ×÷ÓÃÓÚÈÎÒâÂú×ã ErrorType
µÄÀàÐÍ£¬Äã¿ÉÒÔ throw ÈÎÒâÓòµÄ´íÎó¡£¶øÔÚ catch ¿éÖÐÎÒÃÇҲͬÑù¿ÉÒÔÆ¥ÅäÈÎÒâµÄ´íÎóÀàÐÍ£¬ÕâÒ»Çж¼Ã»ÓбàÒëÆ÷±£Ö¤¡£ÓÉÓÚÕâ¸öÔÒò£¬ÏÖÔÚµÄÒì³£´¦Àí»úÖÆ²¢²»ºÃÓã¬ÐèÒª´¦ÀíÒì³£µÄ¿ª·¢ÕßÍùÍùÐèҪͨ¶ÁÎĵµ²ÅÄÜÖªµÀ¿ÉÄÜ»áÓÐÄÄЩÒì³££¬¶øÎĵµµÄά»¤ÓÖÊǶîÍâµÄ¹¤×÷¡£È±ÉÙÇ¿ÖÆ»úÖÆÀ´±£Ö¤Òì³£Å׳öºÍ²¶»ñµÄÀàÐ͵ÄÕýÈ·ÐÔ£¬ÕâΪ³ÌÐòÖÐ
bug µÄ³öÏÖÂñÏÂÁËÒþ»¼¡£
ÊÂʵÉÏ´ÓÎÒÃÇ֮ǰ¶Ô throw µ×²ãʵÏֵķÖÎöÀ´¿´£¬ÔÚÓïÑÔ²ãÃæÉÏʵÏÖÖ»Å׳öÄ³Ò»ÌØ¶¨ÀàÐ͵ĴíÎó²¢²»ÊǺÜÀ§ÄѵÄÊÂÇé¡£µ«ÊÇ¿¼Âǵ½Óë
`NSError` ºÍ´«Í³´íÎó´¦Àí API ¼æÈÝÎÊÌ⣬Swift 2 Öв¢Ã»ÓÐÕâÑùʵÏÖ£¬Ò²ÐíÎÒÃÇÔÚÖ®ºóµÄ
Swift °æ±¾ÖÐÄÜ¿´µ½ÏÞ¶¨ÀàÐ͵ÄÒì³£»úÖÆ¡£
Òì³£µÄµ÷ÊԺͶϵã
Swift µÄÒì³£Å׳ö²¢²»ÊÇ´«Í³ÒâÒåµÄ exception£¬ÔÚµ÷ÊÔʱÅ׳öÒì³£²¢²»»á´¥·¢ Exception
¶Ïµã¡£ÁíÍ⣬throw ±¾ÉíÊÇÓïÑԵĹؼü×Ö£¬¶ø²»ÊÇÒ»¸ö symbol£¬ËüÒ²²»ÄÜ´¥·¢ Symbolic ÀàÐ͵Ķϵ㡣Èç¹ûÎÒÃÇÏ£ÍûÔÚËùÓÐ
throw Óï¾äÖ´ÐеÄʱºòÈóÌÐòͣסµÄ»°£¬ÐèҪһЩ¶îÍâµÄ¼¼ÇÉ¡£ÔÚ֮ǰ throw µÄ»ã±àʵÏÖÖУ¬¿ÉÒÔ¿´µ½ËùÓÐ
throw Óï¾äÔÚ·µ»ØÇ°¶¼»á½øÐÐÒ»´Î swift_willThrow µÄµ÷Óã¬Õâ¾ÍÊÇÒ»¸öÓÐЧµÄ Symbolic
Óï¾ä£¬ÎÒÃÇÉèÖÃÒ»¸ö swift_willThrow µÄ Symbolic ¶Ïµã£¬¾Í¿ÉÒÔÈóÌÐòÔÚ throw
µÄʱºòͣס£¬²¢Ê¹Óõ÷ÓÃÕ»ÐÅÏ¢À´»ñÖª³ÌÐòÔÚÄÄÀïÅ׳öÁËÒì³£¡£
½áÊøÓï ±¾ÎÄͨ¹ý·ÖÎö Swift 2 ÖÐ throw µÄµ×²ãʵÏÖ·½Ê½£¬´ÓÉî²ã´Î²ûÊöÁËÕâһмӹؼü×ÖµÄʹÓ÷½·¨ºÍ¸ß¼¶ÌØÐÔ¡£Í¨¹ýÔÚÏîÄ¿ÖÐʹÓÃеÄÒì³£´¦Àí»úÖÆ£¬¿ÉÒÔ±£Ö¤¸ü¶àµÄ´íÎó´¦ÀíÂß¼¸²¸ÇºÍ¸üÈ«ÃæµÄ»Ö¸´»úÖÆ¡£Í¨¹ýÁоÙʵ¼ùÖеÄһЩʹÓÃÀý×Ó£¬¶ÁÕß¿ÉÒÔѸËÙÔÚÏîÄ¿ÖпªÊ¼Ê¹ÓÃеĴíÎó´¦Àí»úÖÆ£¬Õ⽫°ïÖúÓÐÖúÓÚÌá¸ßËù¹¹½¨Ó¦ÓõÄÔËÐÐÎȶ¨ÐÔ¡£
|