• 本文介绍几点Swift 3.0相对于Swift 2.0的一些改变和使用方法 关于Swift 3.0的具体使用指南大家可以去阅读Swift 3.0中文文档(Swift 3.0 中文文档)和Swift 3.0官网文档(Swift 3.0 官网文档)

    关于Swift 3.0的具体使用指南大家可以去阅读Swift 3.0中文文档(Swift 3.0 中文文档)和Swift 3.0官网文档(Swift 3.0 官网文档

    1.首当其冲的就是闭包的修改。

    升级完Xcode8之后根据提示会默认帮你进行一些修改。但是修改完成还有500+多个错误很大一部分是闭包的修改,我的内心是这样的。

    在Swift2.3中我们写闭包是这样写:

        //Swift 2.2
        typealias detailCollectBlock = (state:Bool)->Void
    
        var detailCollect:detailCollectBlock?
    
        func detailCollect(detailCollect:detailCollectBlock)
        {
            self.detailCollect = detailCollect
        }
    
        //在需要的时候调用
        self.detailCollect?(state:true)
    
        //
        controller.detailPraise({ (state) in
            model.isPraise = (state ? "1" : "0")
                })
        //Swift3中的 使用方法1 
        typealias detailCollectBlock = (Bool)->Void
    
        var detailCollect:detailCollectBlock?
    
        func detailCollect(detailCollect:@escaping detailCollectBlock)
        {
            self.detailCollect = detailCollect
        }
        //在需要的时候调用
        self.detailCollect?(true)
    
        //在上页面回调接收的时候的用法
        controller.detailPraise(detailPraise: { (<#Bool#>) in
             model.isPraise = (state ? "1" : "0")
                })
    
        //使用方法2
        typealias detailCollectBlock = (_ state:Bool)->Void
    
        var detailCollect:detailCollectBlock?
    
        func detailCollect(_ detailCollect:@escaping detailCollectBlock)
        {
            self.detailCollect = detailCollect
        }
    
        //在需要的时候调用
        self.detailCollect?(state:true)
    
        //
        controller.detailPraise({ (state) in
            model.isPraise = (state ? "1" : "0")
                })

    这个时候大家应该就可以从代码中发现,swift3中需要定义闭包的时候不需要命名参数名,只需要告诉参数类型即可.

    现在迁移我们也可以使用方法2,这时我们的参数在使用时还是省略的(就和2.2时使用相同),外部调用闭包的时候就不需要在修改了。这样可以减少很多工作量,因为项目中的闭包实在是太多了..

    如果闭包不是在当前作用域内执行而是还要继续传递到别的函数里的话, 那就必须加上@escaping,本身的意思是逃逸的

    别接收回调的地方也和swift2.2不同,回调方法中会有block的名字,但是没有参数名了(方法2中就没有名字啦),只有参数的类型,我们需要自己来定义参数的名称.

    详情见SE-0103SE-0118

    2.在Swift2.3中我们函数在被调用时的第一个参数名会被省略,除非在前面在此定义eq:

    //这样才会在调用的时候显示参数名 swift2.2时
    func addCollect(detailId detailId)

    在Swift3中我们不需要在这样做了。会一直带有第一个参数名

    3.UIControlState等的表示状态的常量 都变成了首字母小写

    //Swift2.2
    self.toolsView?.praiseButton.setImage(UIImage.init(named: "tool_icon_like_normal"), forState: .Normal)
    
    self.phone?.componentsSeparatedByString() //swift2.2
    
    //swift3
    self.toolsView?.praiseButton.setImage(UIImage.init(named: "tool_icon_like_normal"), for: .normal)
    
    self.phone?.components(separatedBy: "-") //swift3

    这样做也是为了脱离OC冗长的方法命名,精简了语意,但是可读性还需要长时间的检验吧

    3.使用NSDictionary的修改

    dict.setObject(true, forKey: "state")
    dict.setObject(num, forKey: "key")

    在之前我们一直使用NSDictionary(<font color=gray>因为从OC转过来感觉还是NSarray和NSDictionary用起来顺手的</font> ),用来设置key的时候。现在需要添加NSCopying ,所以我都改成Dictionary啦哈哈。现在我们也应该在之后写代码的时候避免使用NSString,NSArray, NSDictionary等因为现在更加不方便了~~

    4.泛型

    //swift2.2
     var selectResult:PHFetchResult?
    
    //swift3
     var selectResult:PHFetchResult<PHAsset>?

    这个是项目中图片管理器所用到的,现在就是需要在PHFetchResult后面告诉它是什么类型,也可以是AnyObject
    这个后面还需要详细的介绍。给自己挖个坑

    5.没有了CGRectMake 改用CGRect.init来初始化或者我们写一个他的扩展.来模拟之前的CGRectmake

    //用来代替,修改的CGRectMake
    func CGRectMake(_ x:CGFloat,_ y:CGFloat,_ width:CGFloat,_ height:CGFloat)->CGRect
    {
        return CGRect.init(x: x, y: y, width: width, height: height)
    }

    6.关于颜色的初始化方法UIColor.color都去掉了括号,并且color的后缀页去掉了,新添加了Url类,也是为了脱离OC的NSUrl吧.

    7.GCD的改变 更加Swift化.

    DispatchQueue.main.async {
        let controller = LoginViewController()
        self.present(controller, animated: true, completion: nil)
                    }

    其实GCD的用法没有太多的改变,只是写法变的更加Swift,去掉了之前C语言的形式,多写读多熟悉应该就好了。

    9.NSString操作的变化

    //swift2.2
       let ch = (pinYinString as NSString).character(at: 0)
    //swift3
        let ch=pinYinString?.unicodeScalars[(pinYinString?.unicodeScalars.startIndex)!]

    因为我需要取到拼音的首字母来进行排序,所以需要获取到首字母的ASCII码。所以使用NSString更方便。但是现在不能这样用了,所以我们只能使用Swift中的这个unicodeScalars来获取啦。

    8.枚举变成了小写,自己定义的时候是大写当他变成.语法的时候Xcode页把它变成了小写

    展开全文
  • 利用present进入的视图控制器,在当前视图控制器里获取present的视图控制器 self.presentingViewController 获取当前视图控制器presented的视图控制器 self.presentedViewController
  • 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerAnimated:completion:这一组函数以模态视图的方式展现、隐藏视图。如果用到了navigationController,还...
  • //跳转页面时设置ViewController的显示风格 let storyboard = UIStoryboard(name: "Demo", bundle: nil) let controller = storyboard.instantiateInitialViewController() controller?.modalPresentationStyle = ...
  • present动画效果 2016-06-02 21:06:53
    视图切换,有NavigationController的时候一般使用push的方法进行切换页面,没有NavigationController的情况下,一般会使用presentViewController来切换视图并携带切换时的动画。切换方法如下:– ...
  • 每当看到新的编程语言我总是会有相当大的兴趣,是的,Swift 3是一门『新语言』,因为它看起来,怎么都不像过往的 Swift。打开一个老的项目时,发现满目疮痍,基本上能标红的代码全被标红了。先来个截图提提神: 图...
  • 本博向大家介绍Swift对象委托的一种变通方法,但遗憾的是该方法在Swift 4.2中会导致App崩溃,生活还要继续,且看本猫如何解决它喽. 什么是对象委托 简单的说对象委托就是对象A假装对象B,当然A和B的类完全不同. 用...
  • Swift 2.3 IOS 8.0 XCode 8.0 添加入口标签在这里只说下静态的好了,暂时还用不到动态的,e.g.<key>UIApplicationShortcutItems <key>UIApplicationShortcutItemType <string>ReceiveMoney</s
  • [Swift]继承 2014-12-01 16:31:01
     1) 只有类能继承其它类型都不支持继承,包括基本类型、集合、结构体、枚举;  2) 和Java一样只支持单继承不支持多继承,Swift的多继承是由协议实现的(和Java的接口很像,可以通过遵守多个协议的方式来间接达到多...
  • iOS中,segue的class为UIStoryboardSegue,用于storyboard中不同视图控制器间转场,即从一个视图控制器转场到另一个视图控制器。Segue的起点必须是一个view...Segue分为以下几种类型,其中Push、Modal、Popover和Replac
  • Block是一个数据类型,有自己的ISA指针,可以保存代码块,多用于参数的传递,只有调用Block的时候才会执行Block中的代理块定义一个block的时候需要用copy,代码块是在栈区分配,一旦离开作用域就会被释放,所以要用...
  • iOS获取父控制器swift 2016-08-22 19:19:21
    最近做项目的时候我将两个控制器的view添加到一个主控制器上(保留两个控制器的对象否则代理啥的都没有),当我在其中两个控制器中push的时候发现不能push。找了半天才发现两个子控制器没有navigationcontroller属性...
  • Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: var stringValue :...
  • 一、视图控制器间正向传值 1、正向传值有两种方式:第一种是通过属性传值,第二种是通过构造方法传值 2、通过属性传值: ... self.present(vc, animated:true, completion:nil) 3、通过构造方法传值
  • 它允许类(或者Swift中结构体)将自身负责的功能委托给其他的类型的实例示例。 https://www.jianshu.com/p/623a0b577539 一、在声明的protocol中为什么要用 @objc 呢? 因为 Swift 的 protocol 是可以除了 class ...
  • Swift 3.0 中的新变化 2016-09-22 10:08:56
    本文翻译自 www.hackingwithswift.com ...说真的,如果你觉得从 Swift 1.2 跳到 Swift 2.0 的变化大的话,那些还真的不算什么。 在这篇文章里,我会尽可能多的用代码示例来解释那些至关重要的改变,希望
  • 有关界面跳转的问题其实很简单,swift现在资料有但不是很多,网上总结的也不是很全面,下面是我总结出来的三种方法分享给大家。 第一种:直接跳转 即是直接右键点击第一个界面的控件按钮托动到第二个界面选择...
  • 环境:macOS10.13.6,xcode10.1,swift4.2 在xcode新建swift测试工程,两个UIViewController(ViewController.swift和FirstViewController.swift) ViewController.swift代码如下: import UIKit import ...
  • Swift ! ? 符号区别 2016-01-17 16:27:26
    Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用变量之前不进行初始化就会报错: var stringValue :...
  • swift_028(Swift 的协议) 2016-10-31 10:47:29
    //***********swift学习之28--协议--*************************** /*  协议规定了用来实现某一特定功能所必需的方法和属性。  任意能够满足协议要求的类型被称为遵循(conform)这个协议。  类,结构体...
1 2 3 4 5 ... 20
收藏数 1,306
精华内容 522