新项目用swift3.0开发,现在基本一个月,来总结一下遇到的问题及解决方案
1,在确定新项目用swift后,第一个考虑的问题是用纯swift呢?还是用swift跟OC混编
考虑到新项目也不可避免的使用很多第三方库,而第三方库不一定支持swift或者有swift的替代版本,所以最终还是决定混编了;
(其实最终决定性因素就是YYModel不支持swift,而目前貌似没有特别好用的swift的json解析库,用惯了那么好用的YYModel之后,再让手写model层真是受不了呀~~)
所以model层还是用OC;
json转model是在网络层做的,所以网络层也就只能跟着用OC,刚好继续用比较数据AFNetworking~
View层,跟ViewController就没啥特殊的了,再不用swift就成纯OC了。。。
2,如果要引入swift库的话,cocoapods要加use_frameworks!命令
加了以后,所有的pod库都会以framework的方式来生成,最直观的变化就是:
在OC的代码中不能直接#import <AFNetworking.h>了,必须得#import <AFNetworking/AFNetworking.h>,
而swift的代码中,可以直接 import AFNetworking这个模块;
3,因为2的关系造成了另外一个比较坑爹的问题,那就是swift的库不受Xcode定义的宏命令的影响
比如某个库里面有定义
#if DEBUG
xxxx
#endif
在oc里面,只需要在工程里面定义 DEBUG就行了;
但是在swift中,定义DEBUG需要在 Build Settings -> Swift Compiler - Custom Flags 的Other Swift Flag中 加入 -DDEBUG ;
而这个debug的定义,对pod里面的库是不生效的。。。
搜来搜去,最终google到用pod install hook的方式来重新设置pod的flag,就是在Podfile中加入下面的代码:
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == 'OJASwiftKit'
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)','-DDEBUG']
end
end
end
end
end
installer.pods_project.targets.each do |target|
if target.name == 'OJASwiftKit'
target.build_configurations.each do |config|
if config.name == 'Debug'
config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)','-DDEBUG']
end
end
end
end
end
其中“OJASwiftKit”是你需要设置的swift库的名字,可以根据需要修改
4,跟3类似的还有腾讯QQSDK不支持bitcode,但是在swift项目中概不了其设置的问题
我是用了自己写的LXMThirdLoginManager来导入第三方登录的sdk,所以第三方sdk的文件都是在pod中,貌似也是因为工程设置对pod不生效,所以QQSDK的bitcode选项关闭不了;
直接把sdk拖到项目里面应该可以解决,但是这样就还得配置很多依赖库什么,不如用pod方便;
根据3的启发,想到是不是也可以用pod install hook 的方式来解决呢?
答案是可以的,再在3的代码中加入一段代码就可以了:
if target.name == 'LXMThirdLoginManager'
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = false
end
end
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = false
end
end
这一段和上面的if target.name == 'OJASwiftKit’平级
5,swift代码不能自动补全的问题
这个网上有很多解决方案了,贴一个对我的机器管用的
1
2
3
4
|
1) Close Xcode
2) Terminal -> rm -rf ~/Library/Developer/Xcode/DerivedData/*
3) Terminal -> rm -rf ~/Library/Caches/com.apple.dt.Xcode
4) Restart Xcode
|
6,swift代码规范
因为之前没有用swift开发过新项目,所以代码规范也没有现成的,本意是尽量跟苹果官方规范保持一致,所以暂定用LinkedIn的swift规范
界面的开发中用swift和用OC感觉差异不是特别大,等遇到了再慢慢补充~