´Ó´«Í³µÄC´úÂëºÍÓëÖ®ÎÞ·ìÅäºÏµÄObjective-C´úÂëÇ¨ÒÆµ½Swift²¢·ÇС¹¤³Ì£¬ÎÒÃǵĴúÂë¿â¿Ï¶¨»áʱ²»Ê±³öÏÖһЩºÍCÐ×÷µÄµØ·½£¬Èç¹ûÏëÒª¼ÌÐøÊ¹ÓÃÄÇЩC APIµÄ»°£¬Á˽âһЩ»ù±¾µÄSwiftÖ¸Õë²Ù×÷ºÍʹÓõÄ֪ʶ»áºÜÓаïÖú¡£

AppleÆÚÍûÔÚSwiftÖÐÖ¸ÕëÄܹ»¾¡Á¿¼õÉٵdz¡¼¸ÂÊ£¬Òò´ËÔÚSwiftÖÐÖ¸Õë±»Ó³ÉäΪÁËÒ»¸ö·ºÐÍÀàÐÍ£¬²¢ÇÒ»¹±È½Ï³éÏó¡£ÕâÔÚÒ»¶¨³Ì¶ÈÉÏÔì³ÉÁËÔÚSwiftÖÐÖ¸ÕëʹÓõÄÀ§ÄÑ£¬ÌرðÊǶÔÄÇЩ²¢²»ÊìϤָÕ룬ҲûÓжàÉÙÖ¸Õë²Ù×÷¾ÑéµÄ¿ª·¢Õߣ¨°üÀ¨ÎÒ×Ô¼ºÒ²ÊÇ£©À´Ëµ£¬ÔÚSwiftÖÐʹÓÃÖ¸ÕëȷʵÊÇÒ»¸öÌôÕ½¡£ÔÚÕâÆªÎÄÕÂÀÎÒÏ£ÍûÄÜ´Ó×î»ù±¾µÄʹÓÿªÊ¼£¬×ܽáÒ»ÏÂÔÚSwiftÖÐʹÓÃÖ¸ÕëµÄһЩ³£¼û·½Ê½ºÍ³¡¾°¡£ÕâÆªÎÄÕ¼ٶ¨ÄãÖÁÉÙÖªµÀÖ¸ÕëÊÇʲô£¬Èç¹û¶ÔÖ¸Õë±¾ÉíµÄ¸ÅÄ̫Çå³þµÄ»°£¬¿ÉÒÔÏÈ¿´¿´ÕâÆªÎå·ÖÖÓCÖ¸Õë½Ì³Ì£¨»òÕßËüµÄÖÐÎİ汾£©£¬Ó¦¸Ã»áºÜÓаïÖú¡£
³õ²½
ÔÚSwiftÖУ¬Ö¸Õ붼ʹÓÃÒ»¸öÌØÊâµÄÀàÐÍÀ´±íʾ£¬ÄǾÍÊÇUnsafePointer<T>¡£×ñÑÁËCocoaµÄÒ»¹á²»¿É±äÔÔò£¬UnsafePointer<T> Ò²ÊDz»¿É±äµÄ¡£µ±È»¶ÔÓ¦µØ£¬Ëü»¹ÓÐÒ»¸ö¿É±ä±äÌ壬UnsafeMutablePointer<T>¡£¾ø´ó²¿·Öʱ¼äÀCÖеÄÖ¸Õë¶¼»á±»ÒÔÕâÁ½ÖÖÀàÐÍÒýÈëµ½SwiftÖУºCÖÐconstÐÞÊεÄÖ¸Õë¶ÔÓ¦UnsafePointer£¨×î³£¼ûµÄÓ¦¸Ã¾ÍÊÇC×Ö·û´®µÄconst char *ÁË)£¬¶øÆäËû¿É±äµÄÖ¸ÕëÔò¶ÔÓ¦UnsafeMutablePointer¡£³ý´ËÖ®Í⣬SwiftÖдæÔÚ±íʾһ×éÁ¬ÐøÊý¾ÝÖ¸ÕëµÄUnsafeBufferPointer<T>£¬±íʾ·ÇÍêÕû½á¹¹µÄ²»Í¸Ã÷Ö¸ÕëCOpaquePointerµÈµÈ¡£ÁíÍâÄã¿ÉÄÜÒѾעÒâµ½ÁË£¬Äܹ»È·¶¨Ö¸ÏòÄÚÈݵÄÖ¸ÕëÀàÐͶ¼ÊÇ·ºÐ͵Ästruct£¬ÎÒÃÇ¿ÉÒÔͨ¹ýÕâ¸ö·ºÐÍÀ´¶ÔÖ¸ÕëÖ¸ÏòµÄÀàÐͽøÐÐÔ¼ÊøÒÔÌṩһ¶¨°²È«ÐÔ¡£
¶ÔÓÚÒ»¸öUnsafePointer<T>ÀàÐÍ£¬ÎÒÃÇ¿ÉÒÔͨ¹ýmemoryÊôÐÔ¶ÔÆä½øÐÐȡֵ£¬Èç¹ûÕâ¸öÖ¸ÕëÊǿɱäµÄUnsafeMutablePointer<T> ÀàÐÍ£¬ÎÒÃÇ»¹¿ÉÒÔͨ¹ýmemory¶ÔËü½øÐи³Öµ¡£±ÈÈçÎÒÃÇÏëҪдһ¸öÀûÓÃÖ¸ÕëÖ±½Ó²Ù×÷ÄÚ´æµÄ¼ÆÊýÆ÷µÄ»°£¬¿ÉÒÔÕâô×ö£º

ÕâÀïºÍCµÄÖ¸ÕëʹÓÃÀàËÆ£¬ÎÒÃÇͨ¹ýÔÚ±äÁ¿ÃûÇ°Ãæ¼ÓÉÏ&·ûºÅ¾Í¿ÉÒÔ½«Ö¸ÏòÕâ¸ö±äÁ¿µÄÖ¸Õë´«µÝµ½½ÓÊÜÖ¸Õë×÷Ϊ²ÎÊýµÄ·½·¨ÖÐÈ¥¡£ÔÚÉÏÃæµÄincrementorÖÐÎÒÃÇͨ¹ýÖ±½Ó²Ù×÷memoryÊôÐԸıäÁËÖ¸ÕëÖ¸ÏòµÄÄÚÈÝ¡£
ÓëÕâÖÖ×ö·¨ÀàËÆµÄÊÇʹÓÃSwiftµÄinout¹Ø¼ü×Ö¡£ÎÒÃÇÔÚ½«±äÁ¿´«Èëinout²ÎÊýµÄº¯Êýʱ£¬Í¬ÑùҲʹÓÃ&·ûºÅ±íʾµØÖ·¡£²»¹ýÇø±ðÊÇÔÚº¯ÊýÌåÄÚ²¿ÎÒÃDz»ÐèÒª´¦ÀíÖ¸ÕëÀàÐÍ£¬¶øÊÇ¿ÉÒÔ¶Ô²ÎÊýÖ±½Ó½øÐвÙ×÷¡£

ËäÈ»&ÔÚ²ÎÊý´«µÝʱ±íʾµÄÒâÒåºÍCÖÐÒ»Ñù£¬ÊÇij¸ö“±äÁ¿µÄµØÖ·”£¬µ«ÊÇÔÚSwiftÖÐÎÒÃÇûÓа취ֱ½Óͨ¹ýÕâ¸ö·ûºÅ»ñȡһ¸öUnsafePointerµÄʵÀý¡£ÐèҪעÒâÕâÒ»µãºÍCÓÐËù²»Í¬£º

Ö¸Õë³õʼ»¯ºÍÄÚ´æ¹ÜÀí
ÔÚSwiftÖв»ÄÜÖ±½ÓÈ¡µ½ÏÖÓжÔÏóµÄµØÖ·£¬ÎÒÃÇ»¹ÊÇ¿ÉÒÔ´´½¨ÐµÄUnsafeMutablePointer¶ÔÏó¡£ÓëSwift ÖÐÆäËû¶ÔÏóµÄ×Ô¶¯ÄÚ´æ¹ÜÀí²»Í¬£¬¶ÔÓÚÖ¸ÕëµÄ¹ÜÀí£¬ÊÇÐèÒªÎÒÃÇÊÖ¶¯½øÐÐÄÚ´æµÄÉêÇëºÍÊͷŵġ£Ò»¸ö UnsafeMutablePointerµÄÄÚ´æÓÐÈýÖÖ¿ÉÄÜ״̬£º
- ÄÚ´æÃ»Óб»·ÖÅ䣬ÕâÒâζ×ÅÕâÊÇÒ»¸ö null Ö¸Õ룬»òÕßÊÇ֮ǰÒѾÊͷŹý£»
- ÄÚ´æ½øÐÐÁË·ÖÅ䣬µ«ÊÇÖµ»¹Ã»Óб»³õʼ»¯£»
- ÄÚ´æ½øÐÐÁË·ÖÅ䣬²¢ÇÒÖµÒѾ±»³õʼ»¯¡£
ÆäÖÐÖ»ÓеÚÈýÖÖ״̬ϵÄÖ¸ÕëÊÇ¿ÉÒÔ±£Ö¤Õý³£Ê¹Óõġ£UnsafeMutablePointerµÄ³õʼ»¯·½·¨(init)Íê³ÉµÄ¶¼ÊÇ´ÓÆäËûÀàÐÍת»»µ½UnsafeMutablePointerµÄ¹¤×÷¡£ÎÒÃÇÈç¹ûÏëҪн¨Ò»¸öÖ¸Õ룬ÐèÒª×öµÄÊÇʹÓÃalloc:Õâ¸öÀà·½·¨¡£¸Ã·½·¨½ÓÊÜÒ»¸önum: Int×÷Ϊ²ÎÊý£¬½«ÏòϵͳÉêÇënum¸öÊýµÄ¶ÔÓ¦·ºÐÍÀàÐ͵ÄÄÚ´æ¡£ÏÂÃæµÄ´úÂëÉêÇëÁËÒ»¸öInt´óСµÄÄڴ棬²¢·µ»ØÖ¸ÏòÕâ¿éÄÚ´æµÄÖ¸Õ룺

½ÓÏÂÀ´Ó¦¸Ã×öµÄÊǶÔÕâ¸öÖ¸ÕëµÄÄÚÈݽøÐгõʼ»¯£¬ÎÒÃÇ¿ÉÒÔʹÓÃinitialize:·½·¨À´Íê³É³õʼ»¯£º

ÔÚÍê³É³õʼ»¯ºó£¬ÎÒÃǾͿÉÒÔͨ¹ýmemoryÀ´²Ù×÷Ö¸ÕëÖ¸ÏòµÄÄÚ´æÖµÁË¡£
ÔÚʹÓÃÖ®ºó£¬ÎÒÃÇ×îºÃ¾¡¿ìÊÍ·ÅÖ¸ÕëÖ¸ÏòµÄÄÚÈݺÍÖ¸Õë±¾Éí¡£Óëinitialize:Åä¶ÔʹÓõÄdestroyÓÃÀ´Ïú»ÙÖ¸ÕëÖ¸ÏòµÄ¶ÔÏ󣬶øÓëalloc:¶ÔÓ¦µÄdealloc:ÓÃÀ´ÊÍ·Å֮ǰÉêÇëµÄÄÚ´æ¡£ËüÃǶ¼Ó¦¸Ã±»Åä¶ÔʹÓãº

×¢Ò⣺ÆäʵÔÚÕâÀï¶ÔÓÚIntÕâÑùµÄÔÚCÖÐÓ³ÉäΪintµÄ“ƽ·²Öµ”À´Ëµ£¬destroy²¢²»ÊDZØÒªµÄ£¬ÒòΪÕâЩֵ±»·ÖÅäÔÚ³£Á¿¶ÎÉÏ¡£µ«ÊǶÔÓÚÏñÀàµÄ¶ÔÏó»òÕ߽ṹÌåʵÀýÀ´Ëµ£¬Èç¹û²»±£Ö¤³õʼ»¯ºÍ´Ý»ÙÅä¶ÔµÄ»°£¬ÊÇ»á³öÏÖÄÚ´æÐ¹Â¶µÄ¡£ËùÒÔûÓÐÌØÊ⿼Âǵϰ£¬²»ÂÛÄÚ´æÖе½µ×ÊÇʲô£¬±£Ö¤initialize:ºÍdestroyÅä¶Ô»áÊÇÒ»¸öºÃϰ¹ß¡£
Ö¸ÏòÊý×éµÄÖ¸Õë
ÔÚSwiftÖн«Ò»¸öÊý×é×÷Ϊ²ÎÊý´«µÝµ½C APIʱ£¬SwiftÒѾ°ïÖúÎÒÃÇÍê³ÉÁËת»»£¬ÕâÔÚAppleµÄ¹Ù·½²©¿ÍÖÐÓиöºÜºÃµÄÀý×Ó£º

¶ÔÓÚÒ»°ãµÄ½ÓÊÜconstÊý×éµÄC API£¬ÆäÒªÇóµÄÀàÐÍΪUnsafePointer£¬¶ø·ÇconstµÄÊý×éÔò¶ÔÓ¦UnsafeMutablePointer¡£Ê¹ÓÃʱ£¬¶ÔÓÚconstµÄ²ÎÊý£¬ÎÒÃÇÖ±½Ó½«SwiftÊý×é´«È루ÉÏÀýÖеÄaºÍb£©£»¶ø¶ÔÓڿɱäµÄÊý×飬ÔÚÇ°Ãæ¼ÓÉÏ&ºó´«Èë¼´¿É£¨ÉÏÀýÖеÄresult£©¡£
¶ÔÓÚ´«²Î£¬Swift½øÐÐÁ˼ò»¯£¬Ê¹ÓÃÆðÀ´·Ç³£·½±ã¡£µ«ÊÇÈç¹ûÎÒÃÇÏëҪʹÓÃÖ¸ÕëÀ´Ïñ֮ǰÓÃmemoryµÄ·½Ê½Ö±½Ó²Ù×÷Êý×éµÄ»°£¬¾ÍÐèÒª½èÖúÒ»¸öÌØÊâµÄÀàÐÍ£ºUnsafeMutableBufferPointer¡£Buffer PointerÊÇÒ»¶ÎÁ¬ÐøµÄÄÚ´æµÄÖ¸Õ룬ͨ³£ÓÃÀ´±í´ïÏñÊÇÊý×é»òÕß×ÖµäÕâÑùµÄ¼¯ºÏÀàÐÍ¡£

Ö¸Õë²Ù×÷ºÍת»»
ÉÏÃæÎÒÃÇ˵¹ý£¬ÔÚSwiftÖв»ÄÜÏñCÀïÄÇÑùʹÓÃ&·ûºÅÖ±½Ó»ñÈ¡µØÖ·À´½øÐвÙ×÷¡£Èç¹ûÎÒÃÇÏë¶Ôij¸ö±äÁ¿½øÐÐÖ¸Õë²Ù×÷£¬ÎÒÃÇ¿ÉÒÔ½èÖúwithUnsafePointerÕâ¸ö¸¨Öú·½·¨¡£Õâ¸ö·½·¨½ÓÊÜÁ½¸ö²ÎÊý£¬µÚÒ»¸öÊÇ inoutµÄÈÎÒâÀàÐÍ£¬µÚ¶þ¸öÊÇÒ»¸ö±Õ°ü¡£Swift»á½«µÚÒ»¸öÊäÈëת»»ÎªÖ¸Õ룬Ȼºó½«Õâ¸öת»»ºóµÄUnsafeµÄÖ¸Õë×÷Ϊ²ÎÊý£¬È¥µ÷Óñհü¡£Ê¹ÓÃÆðÀ´´ó¸ÅÊÇÕâ¸öÑù×Ó£º

ÕâÀïÆäʵÎÒÃÇ×öÁ˺ÍÎÄÕÂÒ»¿ªÊ¼µÄincrementorÏàͬµÄÊÂÇé£¬Çø±ðÔÚÓÚ²»ÐèҪͨ¹ý·½·¨µÄµ÷ÓÃÀ´½«Öµ×ª»»ÎªÖ¸Õë¡£Õâô×öµÄºÃ´¦¶ÔÓÚÄÇЩֻ»áÖ´ÐÐÒ»´ÎµÄÖ¸Õë²Ù×÷À´ËµÊÇÏÔ¶øÒ×¼ûµÄ£¬¿ÉÒÔ½«“ÎÒÃǾÍÊÇÏë¶ÔÕâ¸öÖ¸Õë×öµãʶù”Õâ¸öÒâͼ±í´ïµÃ¸ü¼ÓÇåÎúÃ÷È·¡£
unsafeBitCastÊǷdz£Î£ÏյIJÙ×÷£¬Ëü»á½«Ò»¸öÖ¸ÕëÖ¸ÏòµÄÄÚ´æÇ¿Öư´Î»×ª»»ÎªÄ¿±êµÄÀàÐÍ¡£ÒòΪÕâÖÖת»»ÊÇÔÚSwiftµÄÀàÐ͹ÜÀíÖ®Íâ½øÐеģ¬Òò´Ë±àÒëÆ÷ÎÞ·¨È·±£µÃµ½µÄÀàÐÍÊÇ·ñȷʵÕýÈ·£¬Äã±ØÐëÃ÷È·µØÖªµÀÄãÔÚ×öʲô¡£±ÈÈ磺

ÒòΪNSArrayÊÇ¿ÉÒÔ´æ·ÅÈÎÒâNSObject¶ÔÏóµÄ£¬µ±ÎÒÃÇÔÚʹÓÃCFArrayGetValueAtIndex´ÓÖÐȡֵµÄʱºò£¬µÃµ½µÄ½á¹û½«ÊÇÒ»¸öUnsafePointer<Void>¡£ÓÉÓÚÎÒÃǺÜÃ÷°×ÆäÖдæ·ÅµÄÊÇString¶ÔÏó£¬Òò´Ë¿ÉÒÔÖ±½Ó½«ÆäÇ¿ÖÆ×ª»»ÎªCFString¡£
¹ØÓÚunsafeBitCastÒ»ÖÖ¸ü³£¼ûµÄʹÓó¡¾°ÊDz»Í¬ÀàÐ͵ÄÖ¸ÕëÖ®¼ä½øÐÐת»»¡£ÒòΪָÕë±¾ÉíËùÕ¼ÓõĵĴóСÊÇÒ»¶¨µÄ£¬ËùÒÔÖ¸ÕëµÄÀàÐͽøÐÐת»»ÊDz»»á³öʲôÖÂÃüÎÊÌâµÄ¡£ÕâÔÚÓëһЩC APIÐ×÷ʱ»áºÜ³£¼û¡£±ÈÈçÓкܶàC APIÒªÇóµÄÊäÈëÊÇvoid *£¬¶ÔÓ¦µ½SwiftÖÐΪUnsafePointer<Void>¡£ÎÒÃÇ¿ÉÒÔͨ¹ýÏÂÃæÕâÑùµÄ·½Ê½½«ÈÎÒâÖ¸Õëת»»ÎªUnsafePointer¡£

×ܽá
Swift´ÓÉè¼ÆÉÏÀ´Ëµ¾ÍÊÇÒÔ°²È«×÷ÎªÖØÒªÔÔòµÄ£¬ËäÈ»¿ÉÄÜÓÐЩ†ªà£¬µ«ÊÇ»¹ÊÇÒªÖØÉêÔÚSwiftÖÐÖ±½ÓʹÓúͲÙ×÷Ö¸ÕëÓ¦¸Ã×÷Ϊ×îºóµÄÊֶΣ¬ËüÃÇʼÖÕÊÇÎÞ·¨È·±£°²È«µÄ¡£´Ó´«Í³µÄC´úÂëºÍÓëÖ®ÎÞ·ìÅäºÏµÄObjective-C´úÂëÇ¨ÒÆµ½Swift²¢²»ÊÇÒ»¼þС¹¤³Ì£¬ÎÒÃǵĴúÂë¿â¿Ï¶¨»áʱ²»Ê±³öÏÖһЩºÍCÐ×÷µÄµØ·½¡£ÎÒÃǵ±È»¿ÉÒÔÑ¡ÔñʹÓÃSwiftÖØÐ´²¿·Ö³Â¾É´úÂ룬µ«ÊǶÔÓÚÏñÊǰ²È«»òÕßÐÔÄÜÖÁ¹ØÖØÒªµÄ²¿·Ö£¬ÎÒÃÇ¿ÉÄܳýÁ˼ÌÐøÊ¹ÓÃC APIÒÔÍâ±ðÎÞÑ¡Ôñ¡£Èç¹ûÎÒÃÇÏëÒª¼ÌÐøÊ¹ÓÃÄÇЩAPIµÄ»°£¬Á˽âһЩ»ù±¾µÄSwiftÖ¸Õë²Ù×÷ºÍʹÓõÄ֪ʶ»áºÜÓаïÖú¡£
¶ÔÓÚеĴúÂ룬¾¡Á¿±ÜÃâʹÓÃUnsafe¿ªÍ·µÄÀàÐÍ£¬Òâζ×Å¿ÉÒÔ±ÜÃâºÜ¶à²»±ØÒªµÄÂé·³¡£Swift¸ø¿ª·¢Õß´øÀ´µÄ×î´óºÃ´¦ÊÇ¿ÉÒÔÈÃÎÒÃÇÓøü¼ÓÏȽøµÄ±à³Ì˼Ï룬½øÐиü¿ìºÍ¸üרעµÄ¿ª·¢¡£Ö»ÓÐÔÚ×ðÖØÕâÖÖ˼ÏëµÄǰÌáÏ£¬ÎÒÃDzÅÄܸüºÃµØÏíÊÜÕâÃÅÐÂÓïÑÔ´øÀ´µÄÖÖÖÖÓÅÊÆ¡£ÏÔÈ»£¬ÕâÖÖ˼ÏëÊDz»°üÀ¨µ½´¦Ê¹Óà UnsafePointerµÄ¡£
|