最近作为搬砖工的我 一直在忙别的事情,今天前端大佬找到我,说我把手机升级了,我以前一直拒绝升级手机,因为项目是oc与swift的混合,而xcode 一升级,swift 就相应升级了,结果这次升级了,结果一堆错,几乎就是swift的方法和属性,oc里面掉用不了。。。废话不多说
Xocde升级,Swift升级问题
错误:SWIFT_VERSION '3.0' is unsupported, supported versions are: 4.0, 4.2, 5.0. (in target 'MZMobstazinc')
解决:项目->Build Settings->SwiftLanguage Version
将3.0指向更高版本,这里我只指向了4.2
然后修改相应的错误就可以了
swift 4.0(5.0)与oc 混编问题
oc与swift的正常混合使用的方式
1,当我们在oc项目中添加swift文件的时候系统会默认帮我们创建一个桥头文件。“项目名称-Bridging-Header.m”的文件
2,在Swift中调用oc的类时,只需要在上面桥接头文件import即可
3,在OC中调用Swift类,则需要在OC文件中import"项目名称-Swift.h"头文件即可
关于@objc坑
1,在Swift3使用#selector指定的方法,只有当方法权限为为private时需要加@objc修饰符,现在Swift4.0后全部都要加@objc修饰符(当你已经正常按照混合方式的做法,但是在Swift4.0之后,OC依然无法调用Swift里面的方法和属性,那请在前面加上@objc)
2,定义的方法,枚举,协议或者是属性如果需要被OC调用则需添加@objc
3,自定义的protocol协议中,有optional修饰的非必须实现的方法,需要用@objc修饰
被废弃的方法
1,initailze/dispatch_once 方法已经被Swift4.0废弃所以后续不能再使用
2,截取字符串substring(to: String.Index)、substring(from: String.Index)、substring(with:Range<String.Index>)、removeSubrange(bounds:Range<String.Index>)以及replaceSubrange(bounds:Range<String.Index>,with:Collection)已经被废弃,如何截取,以下是比较快的扩展累的方式:
// 下标截取任意位置的便捷方法
extension String {
var length:Int{
returnself.characters.count
}
subscript(i:Int) ->String{
return self[i ..< i +1]
}
func substring(fromIndex:Int) ->String{
return self[min(fromIndex, length) ..< length]
}
func substring(toIndex:Int) ->String{
returnself[0..< max(0, toIndex)]
}
subscript(r:Range) ->String{
let range =Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), upper: min(length, max(0, r.upperBound))))
let start =index(startIndex, offsetBy: range.lowerBound)
let end =index(start, offsetBy: range.upperBound - range.lowerBound)
return String(self[start ..< end])
}
}
//不包含后几个字符串的方法
extension String {
func dropLast(_n:Int=1) ->String{
return String(characters.dropLast(n))
}
var dropLast:String{
return dropLast()
}
}
Swift版本升级
例如:Swift3.0->Swift4.0
1,选中要转换的target
2,Edit -> Convert -> To Current Swift Syntax
3,勾选需要转换的target (pod 引用不用勾选),next
4,选择转换选项