在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>C語言|源代碼>從Objective-C向Swift轉換經驗分享

從Objective-C向Swift轉換經驗分享

2017-10-12 | rar | 0.3 MB | 次下載 | 1積分

資料介紹

摘要:SendBird是國外一款針對移動App和網站的Chat API,其開發團隊成員Jed Gyeong分享了他們在將產品從Objective-C向Swift轉換過程中所學習到的一些心得體會。
  
  SendBird為常見系統均提供了示例UI,方便開發者構建自己的聊天和短信功能。以前只有Objective-C的iOS示例UI,后來聽到諸多要求開發Swift版本的呼聲,于是我們將示例UI的語言從Objective-C轉換成了Swift。此過程中的最大感受是:兩種語言確實存在不少差異。今天特意分享一些心得給大家,希望對你們有借鑒價值。
  注意:示例UI并不使用Interface Builder(IB,Mac OS X平臺上用于設計和測試用戶界面的應用程序),而是從零開始構建的。所以以下范例不適用于使用Interface Builder的開發者。
  Objective-C和Swift語言示例項目
  SendBird示例UI可從Github庫下載。Objective-C和Swift語言項目均在同一個庫中,我們建議比較兩種代碼庫以更好理解其差異。
  初始化UIView的子類
  在iOS應用上實現UI就需要子類化UIView,也就是要重寫UIView的init方法。注意:兩種語言有所區別。
  Objective-C只需在UIView子類中重寫必要的init方法。要初始化一個UIView框架,就要重寫initWithFrame:框架,如下所示:
  @implementationSubUIView- (id) initWithFrame:(CGRect)frame { self= [superinitWithFrame:frame]; if(self!= nil) { // 。..} returnself; } @end
  然而Swift需要多一些步驟來重寫同一個init方法。首先,重寫使用CGRect框架作為其參數的init方法。根據UIView文檔,用Swift語言構建時,須重寫init(coder:),但我們不需要這種方法,就用如下代碼處理。類屬性初始化所需的代碼可以在init(frame:)中執行。
  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開發的重要步驟。使用Interface Builder的開發者需要重寫initWithNibName:bundle:,但既然我們用代碼來構建UI,就不需要執行這一方法了。只需重寫init方法,在其中初始化類屬性即可。
  @implementationSubUIViewController- (id) init { self= [superinit]; if(self!= nil) { // 。..} returnself; } @end
  Swift也一樣要重寫init()方法。實現指定的初始化init(nibName:bundle:)來子類化UIViewController。重申:此過程不適用Interface Builder,所以無需定義nibName和bundle的值,而是調用比指定初始化更簡單的convenience初始化,將指定初始化init(nibName:bundle:)設為零。現在調用init()來初始化類,用重寫的(nibName:bundle:)執行類屬性。
  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”) } }
  現在可以創建和調用UIViewController的子類,如下所示:
  letviewController: SubUIViewController = SubUIViewController() self.navigationController?.pushViewController(viewController, animated: false)
  使用Auto Layout來實現View
  沒有Interface Builder的情況下,就用Auto Layout中的NSLayoutConstraint類來設置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,則執行以下代碼。這段代碼將創建NSLayoutConstraint(定義self.profileImageView和self之間的位置),然后添加到self上。
  [selfaddConstraint:[NSLayoutConstraintconstraintWithItem:self.profileImageView attribute:NSLayoutAttributeLeadingrelatedBy:NSLayoutRelationEqualtoItem:selfattribute:NSLayoutAttributeLeadingmultiplier:1constant:kMessageCellLeftMargin]];
  使用Swift也可以創建NSLayoutConstraint,具體如下:
  self.addConstraint(NSLayoutConstraint.init(item: self.profileImageView!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: kMessageCellLeftMargin))
  比較兩種語言版本你會發現,不同于Objective-C,Swift是從NSLayoutConstraint調用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等時,使用選擇器來分配要執行的方法。在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的區別。
  在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:來創建一個格式化字符串。
  [self.typingLabelsetText:[NSStringstringWithFormat:@“%d Typing something cool.。..”, count]];
  但在Swift中,String里沒有stringWithFormat方法,所以用init(format:_ arguments:)代之。我們可以分配一個與NSString格式化結構相同的格式化字符串來創建一個新字符串,然后給arguments賦以相關的值。
  self.typingLabel?.text= String.init(format: “%d Typing something cool.。.”, count)
  從數據類型得到最小&最大值
  就從數字格式上得到最小和最大值而言,Objective-C和Swift也有差別。Objective-C使用一個預定義宏來得到最小和最大值,但Swift則可以直接從數據類型上得到這些值。Objective-C使用的是如下的宏:
  CGFLOAT_MAX CGFLOAT_MIN INT32_MAX INT32_MIN LLONG_MAX LLONG_MIN
  而Swift則從數據類型上得到最小和最大值,如下:
  CGFloat.maxCGFloat.minInt32.maxInt32.minInt64.maxInt64.min
  字典和枚舉值
  Objective-C用NSDictionary來定義NSAttributedString的屬性。Swift則用Dictionary而不是NSDictionary,但想為Dictionary分配枚舉值的時候,做法稍有不同。
  Objective-C直接為NSDictionary分配鍵值,如下所示:稱為NSUnderlineStyleSingle的枚舉值不能作為NSDictionary值直接分配,所以要先用@()將它轉換成一個對象。
  NSDictionary *underlineAttribute =@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
  Swift可以直接為Dictionary分配鍵值(如下所示)。如果該值定義為AnyObject,那么Swift就跟Objective-C一樣不能直接使用枚舉值,而是使用rawValue屬性代之。
  letunderlineAttribute: [String: AnyObject] = [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue]
  其他心得
  下表列出了SendBird示例UI項目語言轉換過程中所發現的Objective-C和Swift的其他差異。
  從Objective-C向Swift轉換經驗分享
  結論
  相比Objective-C,Swift有更為嚴格的類型轉換原則,就算有Xcode的自動糾正功能也須嚴格遵守;學習類指定初始化和convenience初始化可以讓語言轉化更輕松一些;Xcode的自動代碼補全和糾正讓Objective-C到Swift的轉換更方便,但太依賴這一功能并不能讓你一勞永逸,還是以Swift的語言指南(Language Guide)為準;即使使用相同名稱的類,也會在兩種語言中遇到針對同一功能的不同方法名稱,所以以類參考文件為準比較保險。
  如果決定使用Swift,建議先學習其基本知識,并試著將手頭現有的Objective-C項目轉化為Swift版本練練手。
  祝好運!
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1490次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  92次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關電源原理及各功能電路詳解
  10. 0.38 MB  |  10次下載  |  免費
  11. 6基于AT89C2051/4051單片機編程器的實驗
  12. 0.11 MB  |  4次下載  |  免費
  13. 7藍牙設備在嵌入式領域的廣泛應用
  14. 0.63 MB  |  3次下載  |  免費
  15. 89天練會電子電路識圖
  16. 5.91 MB  |  3次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關電源設計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537791次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233045次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費
主站蜘蛛池模板: 最新免费jlzzjlzz在线播放| 日日日天天射天天干视频| 三级特黄视频| 久久涩精品| a级黄色毛片三个搞一| аⅴ资源中文在线天堂| 中文字幕777| 黄色免费在线视频| 夜夜爱夜夜爽| jdav视频在线观看| 一区二区三区电影| 色多多免费观看在线| 91精品欧美激情在线播放| 欧美成人激情在线| 依人成人| 国产精品三级在线| 午夜精品久久久久久99热7777| 免费aa| 在线观看视频色| 国产亚洲精品在天天在线麻豆| 天天艹综合| 黄色在线观看网址| 亚洲高清免费视频| 玖玖在线| 国产成人福利夜色影视| 狂捣猛撞侍卫攻双性王爷受| 天天看片天天操| 伊人操| 欧美人与zoxxxx另类9| 三及毛片| 欧美日韩影院| 亚洲欧美色鬼久久综合| xxxxxx日本人免费| 狠狠干2015| tom影院亚洲国产日本一区| 国产婷婷高清在线观看免费| 欧美xxxx日本| 另类图片综合网| 日本videosgratis教师69| 亚洲欧美成人综合久久久| 在线视频精品视频|