本篇主要用于记录在混编过程中遇到的问题
CocoaPods
新建了一个测试项目,OC与Swift混编环境,原始Podfile文件如下
source 'https://github.com/Cocoapods/Specs.git'
platform :ios, '9.0'
inhibit_all_warnings! # 忽略警告
use_frameworks!
abstract_target 'BASE_POD' do
pod 'SDWebImage'
pod 'Kingfisher', '~> 5.0.1'
target 'CocoaPodsTest' do
end
end
Pods install时 爆出 ”CocoaPods could not find compatible versions for pod "Kingfisher"(Specs satisfying the Kingfisher (~> 5.0.1)
dependency were found, but they required a higher minimum deployment target.)“
原因1:
pod 指定的iOS版本低于Kingfisher的最低版本,kingfisher5.0.1要求最低版本为iOS10, Swift4。
解决办法1:
将pod的最低版本修改为10.0 (修改部分: platform :ios, '10.0')
原因2:
类似的报错可能是因为 pod repo 版本过低。
解决办法2:
更新 repo (终端命令: pod repo update)
Swift 调用 OC
描述:
我们在OC项目中创建Swift类时,系统会自动创建桥接文件,名称类似于“XXXXXX-Bridging-Header.h”(其中XXXXXX为工程名称)。该桥接文件的作用是将需要使用到的OC文件桥接给Swift。
解决办法:
在桥接文件中,将Swift需要使用到的OC文件包含进来。(例如: #import <SDWebImage/UIImageView+WebCache.h>), 包含后就可以在所有Swift文件里调用所包含的OC文件了。
Tips:
若先前在自动创建桥接文件时选择了“不创建”,那就需要手动创建桥接文件了。新建个Header(.h)文件,在"Buid Setting -> Objective-C Bridge Header"下填上自己创建的桥接文件路径(路径可以直接拖文件转换成路径,也可以使用$(SRCROOT)/XXXXX/XXXX 等命令)
OC 调用 Swift
描述:
Swift调用OC有桥接文件从中协调,那么OC调用Swift也是类似的。每当我们在混编项目中创建Swift文件时,会自动将我们创建的Swift文件包含到一个名为“XXXXXX-Swift.h”文件中,该文件是隐藏的,我们可以在"Buid Setting -> Objective-C Generated Interface Header Name"看到其存在。
解决办法:
在需要调用到Swift的OC文件中 引入“XXXXXX-Swift.h”文件,我们可以进入该文件看到其具体的桥接内容。
Tips:
因为Swift的程序在编译期就已经确定了函数的调用情况,会压缩掉未使用的方法。在OC调用Swift时,Swift文件内需要在使用到的方法、属性的声明前加上 @objc 来表明该属性或方法会在OC中使用到。我们也能够看到当我们加上 @objc 后,在桥接文件“XXX-Swift.h”文件中也引入了对应的属性和方法说明。
在本文中使用到的 Kingfisher ,其作者在Github上反馈道“因使用到了部分非NSOjbect的东西,所以无法兼容OC使用。“
未完.......
网友评论