Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Swift 2 throws È«½âÎö - ´ÓÔ­Àíµ½Êµ¼ù
 
×÷Õߣºoncealong À´Ô´£º²©¿Í ·¢²¼ÓÚ£º 2016-7-14
  2452  次浏览      28
 

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 ±àÒë¹ý³Ì×ñÑ­·Ç³£¾­µäµÄ 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£¬µ«ÊÇҲûÓй«¿ªµÄÄÚÈÝ£º

extension ErrorType {
}

Çåµ¥ 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 µÄµ×²ãʵÏÖ·½Ê½£¬´ÓÉî²ã´Î²ûÊöÁËÕâһмӹؼü×ÖµÄʹÓ÷½·¨ºÍ¸ß¼¶ÌØÐÔ¡£Í¨¹ýÔÚÏîÄ¿ÖÐʹÓÃеÄÒì³£´¦Àí»úÖÆ£¬¿ÉÒÔ±£Ö¤¸ü¶àµÄ´íÎó´¦ÀíÂß¼­¸²¸ÇºÍ¸üÈ«ÃæµÄ»Ö¸´»úÖÆ¡£Í¨¹ýÁоÙʵ¼ùÖеÄһЩʹÓÃÀý×Ó£¬¶ÁÕß¿ÉÒÔѸËÙÔÚÏîÄ¿ÖпªÊ¼Ê¹ÓÃеĴíÎó´¦Àí»úÖÆ£¬Õ⽫°ïÖúÓÐÖúÓÚÌá¸ßËù¹¹½¨Ó¦ÓõÄÔËÐÐÎȶ¨ÐÔ¡£

   
2452 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ