swift3.0变化总结

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备。Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击。

虽然Swift 3.0 仍处于开发阶段。Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处。然而,我们希望这些变化是一次性的。为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小。一些Swift 2.3的东西已经过时了,并且被删除了。这包括++,--,C风格的for循环,元组语法等等。但不得不说3.0之后的swift变得更加简洁。

  • 关于Bool属性:所有的BOOL类型都重新命名为isXXX,所以以后我们的自定义类中BOOL属性的命名也应体现这个规则

2.3写法:btn.hidden = false

3.0写法:btn.isHidden = false

  • Foundation框架部分类名去掉NS前缀

像UserDefaults、URL、NotificationCenter、Bundle、Timer、Thread、RunLoop等

  • 常用系统提供单例类的获取方法Swift风格化

  • 常用结构体的构造方法改变

Swift2.3中,使用构造方法和make函数都可以创建;

// Make函数创建
 let size = CGSizeMake(10, 20)
// 构造方法创建
 let _ = CGSize(width: 10, height: 20)

  Swift3.0中,废弃make函数,只能使用构造方法创建 

// 只能使用构造方法创建
let _ = CGSize(width: 10, height: 20)
  • 通知的变化

Swift 3.0 中NSNotification和Notification创建时,通知的name参数类型都变为“Notification.Name”类型,该类型创建比较复杂。

// Swift3.0中的通知
let _ = NSNotification(name: NSNotification.Name(rawValue: "name"), object: nil)
  • UIViewController 返回是否显示状态栏的方法变化

状态栏显示由方法func变为var属性

  • 获取string的字符串长度方法的改变

  • 获取沙盒指定文件夹路径的方法变化

获取文件路径统一交给FileManager来管理

  • GCD语法的改变

延迟执行的代码转换的不够好。应该这样写:

// 延迟执行代码
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
    print("明明")
}

Swfit的关键字的变化

  • private和fileprivate

private: 私有属性和方法,仅在当前类中可以访问,不包括分类;

fileprivate: 文件内私有属性和方法,仅在当前文件中可以访问,包括同一个文件中不同的类。

// 只能在当前大括号内访问
  private func privatePractise() {
      value = 1
      fileprivatePractise()
      print("privatePractise方法被调用了")
  }
  // 只能在当前文件内访问
  fileprivate func fileprivatePractise() {
      privatePractise()
      print("fileprivatePractise方法被调用了")
  }
  • public和open

在Swift2.3中,pubic有两层含义:

这个元素可以在其他作用域被访问

这个元素可以在其他作用域被继承或者override

继承是一件危险的事情。尤其对于一个framework或者module的设计者而言。在自身的module内,类或者属性对于作者而言是清晰的,能否被继承或者override都是可控的。但是对于使用它的人,作者有时会希望传达出这个类或者属性不应该被继承或者修改。这个对应的就是 final。

final的问题在于在标记之后,在任何地方都不能override。而对于lib的设计者而言,希望得到的是在module内可以被override,在被import到其他地方后其他用户使用的时候不能被override。

这就是 open产生的初衷。通过open和public标记区别一个元素在其他module中是只能被访问还是可以被override。

在Swift3.0中

public表示当前类、属性或者方法只能在当前module内被继承或者override,在当前module意外只能被访问;

open表示当前类、属性或者方法可以在任何地方被继承或者override;

final是一个辅助修饰词,表示当前类、属性或者方法在任何地方都只能被访问,不能被继承或者override;

internal表示默认级别。

 Swfit3.0中,访问控制权限由高到低依次为:open、public、internal(默认)、fileprivate,private。
  • if…where和guard…where的变化
在Swift2.3中// Swift2.3
var value: Int?
var num: Int?

if let v = value, n = num where v > n {
     print("value > num")
}

value = 1
num = 2

guard let v = value, n = num where v > n else {
     print("value < num")
     return
}

在Swift3.0中

// Swift3.0
var value: Int?
var num: Int?

if let v = value, let n = num, v > n {
    print("value > num")
}

value = 1
num = 2

guard let v = value, let n = num, v > n else {
    print("value < num")
    return
}
  • 方法名的变化

在Swift的方法命名规则中,参数有两个名称,一个内部名,一个外部名。当参数有外部名时,方法调用时只显示外部名,若无外部名,则默认外部名和内部名相同。建议以后自定义方法时,风格尽量和Swift3.0保持一致。

在Swift3.0 编译器环境下两种风格对比:

  • selecter的变化

在Swift2.2中,当我们为一个按钮添加点击事件时常常这样写:

btn.addTarget(self, action:"click", forControlEvents: .TouchUpInside)

在Swift3.0中两种写法依然都可以使用,但建议写成下面格式:

btn.addTarget(self, action:#selector(ViewController.click), for: .touchUpInside)

  • 运算符的变化
  1. Swift3.0中运算符的左右两边必须不能为optional
  2. ++和--是继承自C语言中的运算符,在Swift3.0中被移除,建议使用  += 1/ -= 1来代替
  • 方法,枚举等命名变化

    对于枚举和属性,驼峰大写前缀被替换成了驼峰小写前缀

比如说CGColor或CIColor。是的,现在它将会变成cgColor和ciColor。

let red = UIColor.red().cgColor

这种变化确实提高了编码的一致性:所有的属性和参数应该都是以小写开始,没有例外!

同时,枚举也在发生着改变,从驼峰大写前缀改为驼峰小写前缀。这意味着:枚举是一个数据类型,但是枚举值更接近属性。然而,这意味着苹果的枚举现在都是小写了。

NSTextAlignment.Left// old

NSTextAlignment.left// new

时间: 2024-08-02 02:42:47

swift3.0变化总结的相关文章

Swift3.0变化分享

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击. 虽然Swift 3.0 仍处于开发阶段.Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处.然而,我们希望这些变化是一次性的.为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小.一些Swi

Swift2.3 --&gt; Swift3.0 的变化

Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift2.3的代码转换为Swift3.0. 手动调出Xcode自动转换Swift2.3 到 Swift3.0 弹出语言版本选择界面,选择Covert to Swift3,Next:  进入选择模块界面: 选择模块界面 建议只选择自己创建的模块,第三方框架的模块最好不要使用Xco

(细节控)swift3.0与融云IMKIT开发问题(一部分) override func onSelectedTableRow Method does not override any method from its superclass

原官网文档方案如下,在swift3.0的情况下出现 override func onSelectedTableRow  Method does not override any method from its superclass 这是因为swift3.0 有很多变更,需要更换下onSelectedTableRow参数. //重写RCConversationListViewController的onSelectedTableRow事件 override func onSelectedTableR

使用 swift3.0高仿新浪微博

项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连接匹配,@匹配)支持照片浏览,大图浏览,保存图片到相册本地, 实现发布微博,发微博添加照片,发送Emoticon表情等功能, 先看下项目整体框架 项目使用 MVC 框架,但是在写的过程中也用到了 MVVM设计模式

使用的一些支持swift3.0的开源库

#解决键盘弹起遮挡工具 pod 'IQKeyboardManagerSwift', '~>4.0.6' #多种类型弹出框 pod 'SCLAlertView', :git => 'https://github.com/vikmeup/SCLAlertView-Swift' # Alamofire 网络库 (4.1.0最低支持iOS8.0,4.0最低支持iOS9.0) pod 'Alamofire', '~> 4.0' # swift解析json库 pod 'SwiftyJSON', :g

Swift3.0 函数闭包与OC Block

刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 Swift中定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> String { return ("输出了\(name)") } //通用形式 func name(parameters) -> return type { function body } Swift 中基本的闭包函数与OC中Block的相似点 带参闭包 //OC中Bloc

swift3.0:CoreData的使用

一.介绍 CoreData不像slqite3那样编写代码繁琐,同时避免了使用了SQL语句的麻烦,也可以回避使用C语言的语法,降低了iOS开发的技术门槛. CoreData可降低开发成本,提高代码质量.它是一个完全面向对象的API,能够合理管理内存,负责在数据库中存储数据,底层也是由类似 于SQL的技术实现的.CoreData是持久化存储的最佳方式,数据最终的存储类型可以是SQLite数据库.XML.二进制.内存或自定义数据类型 它和SQLite的区别是:只能取出整个实体记录,然后分离,之后才能得

swift3.0 coredata 的使用

//swift3.0在语法上有很大的改变,以简单的增删改查为例,如下: //User类如下: import Foundation import CoreData extension User { @nonobjc public class func fetchRequest() -> NSFetchRequest<User> { return NSFetchRequest<User>(entityName: "User"); } @NSManaged pu

iOS 日期处理 (Swift3.0 NSDate)

处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate对象(分解成year/month/day/hour/minute/second 等) NSDate相关类 NSDate DateFormatter DateComponents DateComponentFormatter Calendar Date structure: Swift3.0中引入了Date s