從Objective-C向Swift轉(zhuǎn)換經(jīng)驗(yàn)分享
2017-10-12 |
rar |
0.3 MB |
次下載 |
1積分
資料介紹
摘要:SendBird是國外一款針對移動App和網(wǎng)站的Chat API,其開發(fā)團(tuán)隊(duì)成員Jed Gyeong分享了他們在將產(chǎn)品從Objective-C向Swift轉(zhuǎn)換過程中所學(xué)習(xí)到的一些心得體會。
SendBird為常見系統(tǒng)均提供了示例UI,方便開發(fā)者構(gòu)建自己的聊天和短信功能。以前只有Objective-C的iOS示例UI,后來聽到諸多要求開發(fā)Swift版本的呼聲,于是我們將示例UI的語言從Objective-C轉(zhuǎn)換成了Swift。此過程中的最大感受是:兩種語言確實(shí)存在不少差異。今天特意分享一些心得給大家,希望對你們有借鑒價(jià)值。
注意:示例UI并不使用Interface Builder(IB,Mac OS X平臺上用于設(shè)計(jì)和測試用戶界面的應(yīng)用程序),而是從零開始構(gòu)建的。所以以下范例不適用于使用Interface Builder的開發(fā)者。
Objective-C和Swift語言示例項(xiàng)目
SendBird示例UI可從Github庫下載。Objective-C和Swift語言項(xiàng)目均在同一個庫中,我們建議比較兩種代碼庫以更好理解其差異。
初始化UIView的子類
在iOS應(yīng)用上實(shí)現(xiàn)UI就需要子類化UIView,也就是要重寫UIView的init方法。注意:兩種語言有所區(qū)別。
Objective-C只需在UIView子類中重寫必要的init方法。要初始化一個UIView框架,就要重寫initWithFrame:框架,如下所示:
@implementationSubUIView- (id) initWithFrame:(CGRect)frame { self= [superinitWithFrame:frame]; if(self!= nil) { // 。..} returnself; } @end
然而Swift需要多一些步驟來重寫同一個init方法。首先,重寫使用CGRect框架作為其參數(shù)的init方法。根據(jù)UIView文檔,用Swift語言構(gòu)建時,須重寫init(coder:),但我們不需要這種方法,就用如下代碼處理。類屬性初始化所需的代碼可以在init(frame:)中執(zhí)行。
class SubUIView: UIView { override init(frame: CGRect) { super.init(frame: frame) // 。..} required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) } }
初始化UIViewController的子類
子類化UIViewController是iOS開發(fā)的重要步驟。使用Interface Builder的開發(fā)者需要重寫initWithNibName:bundle:,但既然我們用代碼來構(gòu)建UI,就不需要執(zhí)行這一方法了。只需重寫init方法,在其中初始化類屬性即可。
@implementationSubUIViewController- (id) init { self= [superinit]; if(self!= nil) { // 。..} returnself; } @end
Swift也一樣要重寫init()方法。實(shí)現(xiàn)指定的初始化init(nibName:bundle:)來子類化UIViewController。重申:此過程不適用Interface Builder,所以無需定義nibName和bundle的值,而是調(diào)用比指定初始化更簡單的convenience初始化,將指定初始化init(nibName:bundle:)設(shè)為零。現(xiàn)在調(diào)用init()來初始化類,用重寫的(nibName:bundle:)執(zhí)行類屬性。
class SubUIViewController: UIViewController{ convenience init() { self.init(nibName: nil, bundle: nil) } override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Initialize properties of class} required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) } }
現(xiàn)在可以創(chuàng)建和調(diào)用UIViewController的子類,如下所示:
letviewController: SubUIViewController = SubUIViewController() self.navigationController?.pushViewController(viewController, animated: false)
使用Auto Layout來實(shí)現(xiàn)View
沒有Interface Builder的情況下,就用Auto Layout中的NSLayoutConstraint類來設(shè)置View的大小和位置——注意Objective-C和Swift在這里有微妙差別。
Objective-C使用NSLayoutConstraint類中的constraintWithItem方法。
+ (instancetype)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relatedBy:(NSLayoutRelation)relationtoItem:(id)view2attribute:(NSLayoutAttribute)attr2multiplier:(CGFloat)multiplierconstant:(CGFloat)c
Swift使用同一個類中的init方法。
convenience init(item view1: AnyObject, attributeattr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: AnyObject?, attributeattr2: NSLayoutAttribute, multiplier multiplier: CGFloat, constantc: CGFloat)
如果是Objective-C,則執(zhí)行以下代碼。這段代碼將創(chuàng)建NSLayoutConstraint(定義self.profileImageView和self之間的位置),然后添加到self上。
[selfaddConstraint:[NSLayoutConstraintconstraintWithItem:self.profileImageView attribute:NSLayoutAttributeLeadingrelatedBy:NSLayoutRelationEqualtoItem:selfattribute:NSLayoutAttributeLeadingmultiplier:1constant:kMessageCellLeftMargin]];
使用Swift也可以創(chuàng)建NSLayoutConstraint,具體如下:
self.addConstraint(NSLayoutConstraint.init(item: self.profileImageView!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: kMessageCellLeftMargin))
比較兩種語言版本你會發(fā)現(xiàn),不同于Objective-C,Swift是從NSLayoutConstraint調(diào)用init方法的,而且屬性和relatedBy的枚舉值也有差別。
兩種語言NSLayoutConstraint中的枚舉值分別是:
NSLayoutAttribute
Objective-C
typedefenum: NSInteger{ NSLayoutAttributeLeft = 1, NSLayoutAttributeRight, NSLayoutAttributeTop, NSLayoutAttributeBottom, NSLayoutAttributeLeading, NSLayoutAttributeTrailing, NSLayoutAttributeWidth, NSLayoutAttributeHeight, NSLayoutAttributeCenterX, NSLayoutAttributeCenterY, NSLayoutAttributeBaseline, NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline, NSLayoutAttributeFirstBaseline, NSLayoutAttributeLeftMargin, NSLayoutAttributeRightMargin, NSLayoutAttributeTopMargin, NSLayoutAttributeBottomMargin, NSLayoutAttributeLeadingMargin, NSLayoutAttributeTrailingMargin, NSLayoutAttributeCenterXWithinMargins, NSLayoutAttributeCenterYWithinMargins, NSLayoutAttributeNotAnAttribute = 0} NSLayoutAttribute;
Swift
enumNSLayoutAttribute : Int { caseLeft caseRight caseTop caseBottom caseLeading caseTrailing caseWidth caseHeight caseCenterX caseCenterY caseBaseline staticvarLastBaseline: NSLayoutAttribute { get} caseFirstBaseline caseLeftMargin caseRightMargin caseTopMargin caseBottomMargin caseLeadingMargin caseTrailingMargin caseCenterXWithinMargins caseCenterYWithinMargins caseNotAnAttribute }
NSLayoutRelation
Objective-C
enum{ NSLayoutRelationLessThanOrEqual = -1, NSLayoutRelationEqual = 0, NSLayoutRelationGreaterThanOrEqual = 1, }; typedefNSIntegerNSLayoutRelation;
Swift
enumNSLayoutRelation : Int { caseLessThanOrEqual caseEqual caseGreaterThanOrEqual }
選擇器
使用UIButton、NSNotificationCenter、NSTimer等時,使用選擇器來分配要執(zhí)行的方法。在Objective-C中,@selector指令代表使用選擇器。
- (void)test { // 。..mTimer = [NSTimer scheduledTimerWithTimeInterval:1target:self selector:@selector(timerCallback:) userInfo:nil repeats:YES]; } - (void)timerCallback:(NSTimer *)timer { // 。..}
在Swift中,不需要使用指令或字符串來分配方法。
func test() { // 。..self.mTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: “timerCallback:”, userInfo: nil, repeats: true) // 。..} func timerCallback(timer: NSTimer) { // 。..}
字符串
盡管在Swift代碼中也可以用Objective-C專門處理字符串的NSString,但要使用以String對象為屬性的UITextField上的文本或其他的話,就要清楚NSString和String的區(qū)別。
在Objective-C中,UITextField上的文本為NSString,所以屬性的長度就是字符串的長度。
- (BOOL)textFieldShouldReturn:(UITextField *)textField { NSString *message = [textField text]; if([message length] 》 0) { // 。..} returnYES; }
Swift是沒有長度屬性的,所以要用characters屬性的count屬性。
func textFieldShouldReturn(textField: UITextField) -》 Bool { let message: String = textField.text! ifmessage.characters.count 》 0{ // 。..} returntrue }
在Objective-C中,我們用stringWithFormat:來創(chuàng)建一個格式化字符串。
[self.typingLabelsetText:[NSStringstringWithFormat:@“%d Typing something cool.。..”, count]];
但在Swift中,String里沒有stringWithFormat方法,所以用init(format:_ arguments:)代之。我們可以分配一個與NSString格式化結(jié)構(gòu)相同的格式化字符串來創(chuàng)建一個新字符串,然后給arguments賦以相關(guān)的值。
self.typingLabel?.text= String.init(format: “%d Typing something cool.。.”, count)
從數(shù)據(jù)類型得到最小&最大值
就從數(shù)字格式上得到最小和最大值而言,Objective-C和Swift也有差別。Objective-C使用一個預(yù)定義宏來得到最小和最大值,但Swift則可以直接從數(shù)據(jù)類型上得到這些值。Objective-C使用的是如下的宏:
CGFLOAT_MAX CGFLOAT_MIN INT32_MAX INT32_MIN LLONG_MAX LLONG_MIN
而Swift則從數(shù)據(jù)類型上得到最小和最大值,如下:
CGFloat.maxCGFloat.minInt32.maxInt32.minInt64.maxInt64.min
字典和枚舉值
Objective-C用NSDictionary來定義NSAttributedString的屬性。Swift則用Dictionary而不是NSDictionary,但想為Dictionary分配枚舉值的時候,做法稍有不同。
Objective-C直接為NSDictionary分配鍵值,如下所示:稱為NSUnderlineStyleSingle的枚舉值不能作為NSDictionary值直接分配,所以要先用@()將它轉(zhuǎn)換成一個對象。
NSDictionary *underlineAttribute =@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
Swift可以直接為Dictionary分配鍵值(如下所示)。如果該值定義為AnyObject,那么Swift就跟Objective-C一樣不能直接使用枚舉值,而是使用rawValue屬性代之。
letunderlineAttribute: [String: AnyObject] = [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]
其他心得
下表列出了SendBird示例UI項(xiàng)目語言轉(zhuǎn)換過程中所發(fā)現(xiàn)的Objective-C和Swift的其他差異。

結(jié)論
相比Objective-C,Swift有更為嚴(yán)格的類型轉(zhuǎn)換原則,就算有Xcode的自動糾正功能也須嚴(yán)格遵守;學(xué)習(xí)類指定初始化和convenience初始化可以讓語言轉(zhuǎn)化更輕松一些;Xcode的自動代碼補(bǔ)全和糾正讓Objective-C到Swift的轉(zhuǎn)換更方便,但太依賴這一功能并不能讓你一勞永逸,還是以Swift的語言指南(Language Guide)為準(zhǔn);即使使用相同名稱的類,也會在兩種語言中遇到針對同一功能的不同方法名稱,所以以類參考文件為準(zhǔn)比較保險(xiǎn)。
如果決定使用Swift,建議先學(xué)習(xí)其基本知識,并試著將手頭現(xiàn)有的Objective-C項(xiàng)目轉(zhuǎn)化為Swift版本練練手。
祝好運(yùn)!
?
SendBird為常見系統(tǒng)均提供了示例UI,方便開發(fā)者構(gòu)建自己的聊天和短信功能。以前只有Objective-C的iOS示例UI,后來聽到諸多要求開發(fā)Swift版本的呼聲,于是我們將示例UI的語言從Objective-C轉(zhuǎn)換成了Swift。此過程中的最大感受是:兩種語言確實(shí)存在不少差異。今天特意分享一些心得給大家,希望對你們有借鑒價(jià)值。
注意:示例UI并不使用Interface Builder(IB,Mac OS X平臺上用于設(shè)計(jì)和測試用戶界面的應(yīng)用程序),而是從零開始構(gòu)建的。所以以下范例不適用于使用Interface Builder的開發(fā)者。
Objective-C和Swift語言示例項(xiàng)目
SendBird示例UI可從Github庫下載。Objective-C和Swift語言項(xiàng)目均在同一個庫中,我們建議比較兩種代碼庫以更好理解其差異。
初始化UIView的子類
在iOS應(yīng)用上實(shí)現(xiàn)UI就需要子類化UIView,也就是要重寫UIView的init方法。注意:兩種語言有所區(qū)別。
Objective-C只需在UIView子類中重寫必要的init方法。要初始化一個UIView框架,就要重寫initWithFrame:框架,如下所示:
@implementationSubUIView- (id) initWithFrame:(CGRect)frame { self= [superinitWithFrame:frame]; if(self!= nil) { // 。..} returnself; } @end
然而Swift需要多一些步驟來重寫同一個init方法。首先,重寫使用CGRect框架作為其參數(shù)的init方法。根據(jù)UIView文檔,用Swift語言構(gòu)建時,須重寫init(coder:),但我們不需要這種方法,就用如下代碼處理。類屬性初始化所需的代碼可以在init(frame:)中執(zhí)行。
class SubUIView: UIView { override init(frame: CGRect) { super.init(frame: frame) // 。..} required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) } }
初始化UIViewController的子類
子類化UIViewController是iOS開發(fā)的重要步驟。使用Interface Builder的開發(fā)者需要重寫initWithNibName:bundle:,但既然我們用代碼來構(gòu)建UI,就不需要執(zhí)行這一方法了。只需重寫init方法,在其中初始化類屬性即可。
@implementationSubUIViewController- (id) init { self= [superinit]; if(self!= nil) { // 。..} returnself; } @end
Swift也一樣要重寫init()方法。實(shí)現(xiàn)指定的初始化init(nibName:bundle:)來子類化UIViewController。重申:此過程不適用Interface Builder,所以無需定義nibName和bundle的值,而是調(diào)用比指定初始化更簡單的convenience初始化,將指定初始化init(nibName:bundle:)設(shè)為零。現(xiàn)在調(diào)用init()來初始化類,用重寫的(nibName:bundle:)執(zhí)行類屬性。
class SubUIViewController: UIViewController{ convenience init() { self.init(nibName: nil, bundle: nil) } override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Initialize properties of class} required init?(coder aDecoder: NSCoder) { fatalError(“init(coder:) has not been implemented”) } }
現(xiàn)在可以創(chuàng)建和調(diào)用UIViewController的子類,如下所示:
letviewController: SubUIViewController = SubUIViewController() self.navigationController?.pushViewController(viewController, animated: false)
使用Auto Layout來實(shí)現(xiàn)View
沒有Interface Builder的情況下,就用Auto Layout中的NSLayoutConstraint類來設(shè)置View的大小和位置——注意Objective-C和Swift在這里有微妙差別。
Objective-C使用NSLayoutConstraint類中的constraintWithItem方法。
+ (instancetype)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relatedBy:(NSLayoutRelation)relationtoItem:(id)view2attribute:(NSLayoutAttribute)attr2multiplier:(CGFloat)multiplierconstant:(CGFloat)c
Swift使用同一個類中的init方法。
convenience init(item view1: AnyObject, attributeattr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: AnyObject?, attributeattr2: NSLayoutAttribute, multiplier multiplier: CGFloat, constantc: CGFloat)
如果是Objective-C,則執(zhí)行以下代碼。這段代碼將創(chuàng)建NSLayoutConstraint(定義self.profileImageView和self之間的位置),然后添加到self上。
[selfaddConstraint:[NSLayoutConstraintconstraintWithItem:self.profileImageView attribute:NSLayoutAttributeLeadingrelatedBy:NSLayoutRelationEqualtoItem:selfattribute:NSLayoutAttributeLeadingmultiplier:1constant:kMessageCellLeftMargin]];
使用Swift也可以創(chuàng)建NSLayoutConstraint,具體如下:
self.addConstraint(NSLayoutConstraint.init(item: self.profileImageView!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: kMessageCellLeftMargin))
比較兩種語言版本你會發(fā)現(xiàn),不同于Objective-C,Swift是從NSLayoutConstraint調(diào)用init方法的,而且屬性和relatedBy的枚舉值也有差別。
兩種語言NSLayoutConstraint中的枚舉值分別是:
NSLayoutAttribute
Objective-C
typedefenum: NSInteger{ NSLayoutAttributeLeft = 1, NSLayoutAttributeRight, NSLayoutAttributeTop, NSLayoutAttributeBottom, NSLayoutAttributeLeading, NSLayoutAttributeTrailing, NSLayoutAttributeWidth, NSLayoutAttributeHeight, NSLayoutAttributeCenterX, NSLayoutAttributeCenterY, NSLayoutAttributeBaseline, NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline, NSLayoutAttributeFirstBaseline, NSLayoutAttributeLeftMargin, NSLayoutAttributeRightMargin, NSLayoutAttributeTopMargin, NSLayoutAttributeBottomMargin, NSLayoutAttributeLeadingMargin, NSLayoutAttributeTrailingMargin, NSLayoutAttributeCenterXWithinMargins, NSLayoutAttributeCenterYWithinMargins, NSLayoutAttributeNotAnAttribute = 0} NSLayoutAttribute;
Swift
enumNSLayoutAttribute : Int { caseLeft caseRight caseTop caseBottom caseLeading caseTrailing caseWidth caseHeight caseCenterX caseCenterY caseBaseline staticvarLastBaseline: NSLayoutAttribute { get} caseFirstBaseline caseLeftMargin caseRightMargin caseTopMargin caseBottomMargin caseLeadingMargin caseTrailingMargin caseCenterXWithinMargins caseCenterYWithinMargins caseNotAnAttribute }
NSLayoutRelation
Objective-C
enum{ NSLayoutRelationLessThanOrEqual = -1, NSLayoutRelationEqual = 0, NSLayoutRelationGreaterThanOrEqual = 1, }; typedefNSIntegerNSLayoutRelation;
Swift
enumNSLayoutRelation : Int { caseLessThanOrEqual caseEqual caseGreaterThanOrEqual }
選擇器
使用UIButton、NSNotificationCenter、NSTimer等時,使用選擇器來分配要執(zhí)行的方法。在Objective-C中,@selector指令代表使用選擇器。
- (void)test { // 。..mTimer = [NSTimer scheduledTimerWithTimeInterval:1target:self selector:@selector(timerCallback:) userInfo:nil repeats:YES]; } - (void)timerCallback:(NSTimer *)timer { // 。..}
在Swift中,不需要使用指令或字符串來分配方法。
func test() { // 。..self.mTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: “timerCallback:”, userInfo: nil, repeats: true) // 。..} func timerCallback(timer: NSTimer) { // 。..}
字符串
盡管在Swift代碼中也可以用Objective-C專門處理字符串的NSString,但要使用以String對象為屬性的UITextField上的文本或其他的話,就要清楚NSString和String的區(qū)別。
在Objective-C中,UITextField上的文本為NSString,所以屬性的長度就是字符串的長度。
- (BOOL)textFieldShouldReturn:(UITextField *)textField { NSString *message = [textField text]; if([message length] 》 0) { // 。..} returnYES; }
Swift是沒有長度屬性的,所以要用characters屬性的count屬性。
func textFieldShouldReturn(textField: UITextField) -》 Bool { let message: String = textField.text! ifmessage.characters.count 》 0{ // 。..} returntrue }
在Objective-C中,我們用stringWithFormat:來創(chuàng)建一個格式化字符串。
[self.typingLabelsetText:[NSStringstringWithFormat:@“%d Typing something cool.。..”, count]];
但在Swift中,String里沒有stringWithFormat方法,所以用init(format:_ arguments:)代之。我們可以分配一個與NSString格式化結(jié)構(gòu)相同的格式化字符串來創(chuàng)建一個新字符串,然后給arguments賦以相關(guān)的值。
self.typingLabel?.text= String.init(format: “%d Typing something cool.。.”, count)
從數(shù)據(jù)類型得到最小&最大值
就從數(shù)字格式上得到最小和最大值而言,Objective-C和Swift也有差別。Objective-C使用一個預(yù)定義宏來得到最小和最大值,但Swift則可以直接從數(shù)據(jù)類型上得到這些值。Objective-C使用的是如下的宏:
CGFLOAT_MAX CGFLOAT_MIN INT32_MAX INT32_MIN LLONG_MAX LLONG_MIN
而Swift則從數(shù)據(jù)類型上得到最小和最大值,如下:
CGFloat.maxCGFloat.minInt32.maxInt32.minInt64.maxInt64.min
字典和枚舉值
Objective-C用NSDictionary來定義NSAttributedString的屬性。Swift則用Dictionary而不是NSDictionary,但想為Dictionary分配枚舉值的時候,做法稍有不同。
Objective-C直接為NSDictionary分配鍵值,如下所示:稱為NSUnderlineStyleSingle的枚舉值不能作為NSDictionary值直接分配,所以要先用@()將它轉(zhuǎn)換成一個對象。
NSDictionary *underlineAttribute =@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
Swift可以直接為Dictionary分配鍵值(如下所示)。如果該值定義為AnyObject,那么Swift就跟Objective-C一樣不能直接使用枚舉值,而是使用rawValue屬性代之。
letunderlineAttribute: [String: AnyObject] = [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]
其他心得
下表列出了SendBird示例UI項(xiàng)目語言轉(zhuǎn)換過程中所發(fā)現(xiàn)的Objective-C和Swift的其他差異。

結(jié)論
相比Objective-C,Swift有更為嚴(yán)格的類型轉(zhuǎn)換原則,就算有Xcode的自動糾正功能也須嚴(yán)格遵守;學(xué)習(xí)類指定初始化和convenience初始化可以讓語言轉(zhuǎn)化更輕松一些;Xcode的自動代碼補(bǔ)全和糾正讓Objective-C到Swift的轉(zhuǎn)換更方便,但太依賴這一功能并不能讓你一勞永逸,還是以Swift的語言指南(Language Guide)為準(zhǔn);即使使用相同名稱的類,也會在兩種語言中遇到針對同一功能的不同方法名稱,所以以類參考文件為準(zhǔn)比較保險(xiǎn)。
如果決定使用Swift,建議先學(xué)習(xí)其基本知識,并試著將手頭現(xiàn)有的Objective-C項(xiàng)目轉(zhuǎn)化為Swift版本練練手。
祝好運(yùn)!
?
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- TPS543C20A SWIFT™降压转换器评估模块用户指南0次下载
- TPS56C215 SWIFT™降压转换器评估模块用户指南0次下载
- TPS543C20 SWIFT™降压转换器评估模块用户指南0次下载
- TPS543C20两相SWIFT™降压转换器评估模块用户指南0次下载
- ReactiveObjCBridge连接Swift和objective-C API0次下载
- 如何从Java转型Objective-C的详细资料分析2次下载
- IOS面试宝典之Swift0次下载
- Objective-C与Runtime的详细资料介绍让你不在问为什么3次下载
- ObjectiveC-Class-Ivar-Layout的使用方法详解2次下载
- objective-c简体中文手册14次下载
- 基于Objective-C实现动态加载2次下载
- 如何扩展 Objective-C 语言2次下载
- 第15章objective-C编程语言0次下载
- Objective-C基础教程2次下载
- Objective-C.2.0程序设计(原书第2版).(美)St0次下载
- 静态分析工具2871次阅读
- OLLVM和LLVM功能介绍8062次阅读
- 面向未来的五款编程语言1978次阅读
- 从哪些方面进行提高无铅波峰焊接的质量3412次阅读
- 如何实现电平转换,多种方法12586次阅读
- Android开发的经验总结2869次阅读
- C语言的简介和特点说明8229次阅读
- c语言摄氏度与华氏温度如何转换24037次阅读
- 新唐科技I²C系列电平转换器介绍1927次阅读
- 2019年的编程语言排行榜你知道吗25121次阅读
- 学习单片机C语言的经验分享8031次阅读
- Swift 2无人机模块化设计解决方案1537次阅读
- mybatis使用经验小结2076次阅读
- 从AI小白直接晋级为具备一年经验的人工智能工程师的方法7990次阅读
- MAX6618 PECI至I2C转换器1362次阅读
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1490次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關(guān)電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費(fèi)
- 6基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
- 7藍(lán)牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
- 0.63 MB | 3次下載 | 免費(fèi)
- 89天練會電子電路識圖
- 5.91 MB | 3次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537791次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評論