ObjC/Swift Swift 改写客户端,酝酿中...

huacnlee · 2014年06月04日 · 最后由 huacnlee 回复于 2014年12月02日 · 8970 次阅读

昨晚研究,有整到凌晨 3 点钟...连续两晚没睡好了 😫

  • 其实从语法上来说,没比 Objective-C 精简多少,主要是 Cocoa 系列的方法名都是巨长的,witBlabla 什么的;
  • 调用一些不标准的三方 Objective-C 库略有问题;
  • Swift 的标准库貌似有许多文档目前还没完成;
  • 将一个老的 Objective-C 写的项目转成 Swift 很简单,只需要增加一个 .swift 文件,XCode 就会自动加上一些编译参数,还有 *-Bridging-Header.h 文件用于帮助 Swift 的文件引用 Objective-C 的库,只需要把所有需要的加到这里,比如: c #import <Cocoa/Cocoa.h> #import <Sparkle/Sparkle.h> #import "FayeClient.h" #import "JSONKit.h" #import "Reachability.h" #import "RCSettingsUtil.h"

话说那个变量那坨我没搞懂,编译的时候要求得在 init 之前初始化...

class RCAppController: NSStatusBar {
  // 本想这样的
  // var fayeClient: FayeClient
  var fayeClient: FayeClient = FayeClient()
}
property 'self.fayeClient' not initialized at super.init call

除了 Swift 語言本身以外,關鍵還得有配套的類庫跟進才行。如果以後還沿用 objective c 的那套類庫覺得有點不倫不類。

@huacnlee 我觉得大部分 var 变量都应该改成 let . NSLog 貌似可以直接改用 println 了. NSString 可以直接用 String 代替,它们可用的方法全都一样。

if (dict.objectForKey("temp_access_token") != nil) {
}
// =>
if let user_channel_id = dict.objectForKey("temp_access_token") {
}

#4 楼 @huacnlee 所有成员都要求在声明时赋值或者在 init 方法里面赋值,Swift 对于 nullable value 还需要用问号显式声明,真是零容忍,跟 OC 完全是两个对立面。

....对……关键 API 一点都没改。。。

if dict.objectForKey("key") != nil 不是可以改成 if dict["key"]

#4 楼 @huacnlee 实例变量等号右边的默认值语句是初始化的时候执行的,直接这样写就好了:

class RCAppController: NSStatusBar {
  var fayeClient = FayeClient() // 有推断的不用加类型
}

#9 楼 @luikore 老语法直译...

改写完了吗

需要 登录 后方可回复, 如果你还没有账号请 注册新账号