oc 和 swift 怎么选?

oc 和 swift 怎么选?

都有哪些优点和缺点?

objective-c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
id<IPLXEmbyDataSource> store = XGET(IPLXEmbyDataSource);
@weakify(self);
self.siteListView.viewModel.onModifyItem = ^(IPLXEmbySiteModel *site) {
@strongify(self);
IPLXSiteAddViewModel *viewModel = self.userView.viewModel;
viewModel.remarkValue = site.server.remark;
viewModel.serverValue = site.server.url;
viewModel.usernameValue = site.user.name;
viewModel.passwordValue = @"";
};
[RACObserve(store, sites) subscribeNext:^(id _Nullable x) {
@strongify(self);
id<IPLXEmbyDataSource> store = XGET(IPLXEmbyDataSource);
self.siteListView.viewModel.items = store.sites;
}];

优点:

  • 借助宏,可以实现很多方便的功能,简化代码
  • 可以直接调用c/c++代码
  • 借助oc运行时,可以方便实现很多功能
  • 头文件和实现文件分离,方便查看代码,屏蔽实现细节
  • 空安全,对空指针发消息不会崩溃
  • 简单易学,效率高
  • 可以直接调用swift代码
  • 生态好,很多第三方库

缺点:

  • 泛型支持不好
  • 没有名称空间
  • 苹果不更新了
  • 逆向工程容易

swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
listView.viewModel.canEditItem = { (site: Any) in
return true;
};
listView.viewModel.onDeleteItem = { (site: Any) in
guard let site = site as? IPLXEmbySiteModel else { return }
guard let store = #xget(IPLXEmbyDataSource) else { return }
if (store.site.isEqual(site)) {
let model = IPLXToastModel();
model.style = .error;
model.title = #i18n("site.edit.disable") ?? "";
model.content = #i18n("site.edit.disable.reason") ?? "";
IPLXToastHelper.showToast(model)
} else {
store.deleteSite(site)
}
};

优点:

  • 泛型支持好
  • 有名称空间
  • 新版添加了宏,可以实现很多方便的功能,简化代码,但是不如oc的宏强大,比如上面的guard let ...这个用宏实现就会报错
  • UI视图可以预览
  • 支持多平台,并且可以直接调用oc代码
  • 逆向工程难

缺点:

  • 语法繁琐,学习成本高
  • 屏蔽了很多底层细节

项目中如何选择?

如果是新项目,两种都可以,反正可以混编。