3.0升级到4.0 swift

2017-10-12 19:24:19 leafgw 阅读数 2805

本次升级由swift2.3->swift4.0

swift2.3升级swift3.0
pravite -> fileprivate
Publice -> open
枚举更换小写
方法名更精简,后面括号移除

gcd方法改变
gcdtimer创建方法返回值类型变了 DispatchSource -> DispatchSourceTimer
setTimer(start: DispatchTime.now() + Double(0) / Double(NSEC_PER_SEC), interval: interval * NSEC_PER_SEC, leeway: 0)
-> scheduleRepeating(deadline: .now(), interval: .seconds(interval))

NS 去掉,AnyObject -> Any
字典用下标取值
let interfaceData = data as NSDictionary
currentSSID = interfaceData["SSID"] as! String

-> 

let interfaceData = data as Dictionary
currentMac = interfaceData.index(forKey: "BSSID" as NSObject) as! String

block需要@escaping修饰

自动布局
snapkit
snp_ -> snp.

网络请求
Alamofire
方法名更换,请求post\get
所有通知更换,枚举更换小写Notification.Task.DidCancel -> Notification.Name.Task.DidCancel

方法的第一个参数加_ ,调用时可省略参数名,不加则需要参数名


一些属性的名字改变isNetworkActivityIndicatorVisible 网络请求的菊花
selecte -> isSelecte
hidden -> isHidden
等等

- - - - - - - - - - - - - - - - - - — - — - - - - - - - - — 

swift3.0 - > swift 4.0

设备相机枚举,类更细分
AVMetadataObjectTypeCode128Code -> AVMetadataObject.ObjectType.code128

AVCaptureSessionPreset1920x1080 -> AVCaptureSession.Preset.hd1920x1080

AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) -> AVCaptureDevice.default(for: AVMediaType.video)

不识别前边下方会有红色下划线,提示更详细替换

按command左键点击代码会有弹窗选择进入类详情或帮助,右键直接进详情

#selector方法需要@objc修饰

The use of Swift 3 @objc inference in Swift 4 mode is deprecated警告
build setting swift3 @objc inference 设置为off 
提示信息可以复制

MPI -> Double.pi π
字体属性

所有通知名改为

NSNotification.Name.XXX.rawValue

2016-09-22 15:49:11 yutianlong9306 阅读数 850


前言 ——

Xcode 8 出来也有一段时间了,这两天用了下,也基本是开始使用了,在这里就把自己项目用到的库,分享下这几天使用Xcode 8 踩的一些小坑,和解决办法,其实处理情况觉得都大同小异,明白报错原因就容易了~ 希望能帮助小伙伴,如果有小伙伴用到了什么 Swift 的第三方,遇坑的欢迎留言、分享给更多的小伙伴~ 一起解决。

注意: 1、如果要直接使用项目尝试升级的话,一定要备份!!备份!!备份!!
     2、可以保留着Xcode 7.3.1 和 Xcode 8 两个版本,如果迁移不成功的话可以替换为原来的开发工具。

正题 ——

踩坑过程

使用Xcode 8创建一个空项目,用终端编辑 Podfile 文件,导入第一个库  SnapKit ,如下:





然后用 Xcode 8 打开,会有这样的提示 :





大概意思就是问你,是否现在升级 Swift ?  Later -> 稍后 , Convert -> 升级。

一开始,根据提示,我们大都会选择 升级,然后在选择 Convert to Swift 3.0 升级到3.0 ,再 Next ,

然后就会出现转换前 和 转换后的语法对比,点击 Save 保存的时候提示如下 :





意思是是否解锁当前的库,然后更改这些? 一般的来说,CocoaPods 导入的第三方库,都是锁定的不允许更改的,到这一步的时候,其实已经觉得可能会迁移失败了,点击了 Unlock ,然后再编译,果然没失望... 确实编译不过了,第一次迁移失败了...
其实到这,就知道,如果有到这一步 询问你是否解锁的过程,那基本会是失败的了。
按照正常的逻辑,像这些第三方的库,升级语法应该都是作者已经更新好了的,我们只需要 update ,或者升级本地库的方式去处理,那么应该这样处理:


SnapKit 处理方式


在询问 Convert to Current Swift Syntax? 先选择 Later,再确认 Later 。

然后编译,出现这样的错误

Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.


按错误的字面意思,是需要正确的配置这个库的目标版本。。。那好,选中 Pods -> Targets 下选中 SnapKit ,在选择 Build Settings ,搜索 Swift Compiler - Version, 然后将 Use Legacy Swift Language Version 对应的项 选择 NO 。 意思是 如果你的库是最新的3.0语法,则选择 NO,不使用旧版本语法。 如果还是2.x的语法,则选择 YES 。 再编译项目 ,成功! ^_^    如下图




DKImagePickerController 处理方式

这个库是一个相册选取库,我们在 Podfile 文件中加入 pod 'DKImagePickerController' , 然后 pod install
然后打开项目,用 SnapKit 的处理方式,但是 Use Legacy Swift Language Version 无论选择 NO 还是 YES ,都不能编译通过,为什么呢? 然后仔细看错误,实际上语法还是旧版本的,那也就是说明实际上还没有更新到最新的? 根据这个点,去这个库的 Github 上看了一下 ,作者确实已经更新了,并且已支持 Xcode 8 and Swift 3




这就奇怪了? 然后再回终端看一下,刚刚 pod install 库的版本 ,再 pod search DKImagePickerController 一下,版本都是显示 3.3.4 






然而 Github 上最新的是 3.4.0



所以确实是我们自己本地库的代码不是最新的,所以,,所以,,我们需要这样更新
现在 Github 上,将下载地址 copy 一下,





然后重新编辑 Podfile 文件,pod 'DKImagePickerController' 后面加上指定地址,就是刚刚copy的,如下:





然后我们重新 pod install .
再打开项目, 在询问 Convert to Current Swift Syntax? 先选择 Later,再确认 Later 。
按照 SnapKit 的处理方式,将 SnapKit 和 DKImagePickerController 的 Use Legacy Swift Language Version 对应的项 选择 NO . 再编译,通过。





总结

1、 要先确定你的这个 Swift 库,是否已支持 3.0 ,再设置 Use Legacy Swift Language Version 是否支持旧版。

2、 如果1的方法不行,要再确定本地库的代码是否是最新的,版本和Github上的最新一致。


.
.
.
.
.
.
.




未完待续...





























2018-05-15 10:05:10 xiaoxiaocode 阅读数 1230

我们以斗鱼APP为例,总结swift3.0以及swift4.0转换过程中遇到的问题。

一、方法重写问题

1、swift 3.0在子类中的方法重写

我们RecommendVC类继承自BaseAnchorVC,BaseAnchorVC中包含setupUI方法,我们重写setupUI方法,然后再子类RecommendVC中重写setupUI方法。

extension RecommendVC {
    override func setupUI(){
        //调用父类方法
        super.setupUI()
        collectionView.addSubview(cycleView)
        collectionView.addSubview(gameView)
        //拓宽collectionView的高度
        collectionView.contentInset = UIEdgeInsets(top: kCycleViewH+kGameViewH, left: 0, bottom: 0, right: 0)
    }
}

2、swift4.0方法的重写

在swift4.0方法中不可使已使用这种方法重写,否则会报错。如下图所示:
swift4.0在子类中重写方法错误
由于无法重写方法,所以我们目前就不重写父类方法,而是重新给子类定义一个方法使用。

二、KVC自动赋值问题

1、在swift3.0中,我们从服务器获取数据之后,进行字典转模型,然后使用KVC自动赋值。

class CycleModel: NSObject {
    var title : String = ""
    var pic_url : String = ""
    var anchor : AnchorModel?
    //didSet自动监控值的变化,使用guard进行检验
    var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }    
    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    //防止在KVC赋值时有找不到key导致的崩溃
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}

2、在swift4.0中,直接这样使用无效。

我们必须在属性前添加@objc,只有这样才能满足OC的KVC赋值。

class CycleModel: NSObject {
    @objc var title : String = ""
    @objc var pic_url : String = ""
    @objc var anchor : AnchorModel?
    @objc var room :[String :Any]?{
        didSet{
            guard let room = room  else {
                return
            }
            anchor = AnchorModel(dict: room)
        }
    }

    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)
    }

    override func setValue(_ value: Any?, forUndefinedKey key: String) {

    }
}
2019-04-22 04:31:05 weixin_34161083 阅读数 4389

SWIFT_VERSION '5.0' is unsupported, supported versions are: 3.0, 4.0, 4.2.

最快的解决方法:

1.Mac电脑升级到最新版 2.Xcode升级到最新版(在App Store中更新) 3.在Xcode的黄色警告栏(若有)那里升级到Swift5

温馨提示:常时保持Mac,Xcode,Swift,iOS设备(iPhone或iPad)为最新版本有助于消除iOS开发中的很多错误。