• dispatch_once方法甩掉,能够行使如下三种艺术完结:

public extension DispatchQueue {
private static var _onceTracker =
String
/**
Executes a block of code, associated with a unique token, only once. The
code is thread safe and will
only execute the code once even in the presence of multithreaded
calls.

  • parameter token: A unique reverse DNS style name such as
    com.vectorform.<name> or a GUID
  • parameter block: Block to execute once
    */
    public class func once(token: String, block:()->Void) {
    objc_sync_enter(self)
    defer { objc_sync_exit(self) }
    if _onceTracker.contains(token) {
    return
    }
    _onceTracker.append(token)
    block()
    }
    }

第二种办法是苹果推荐的情势(xCode自动将swift升级时,大概拥有的dispath_once方法都会活动转换成上面这种方式),代码如下:

var t: SomeObject?
private static var __once: () = {
//此处做几回性操作
t = SomeObject()
}()

一旦单纯是要求单例格局的话可以由此如下代码完毕(static let
标记的常量,为线程安全的,并且是懒加载,只赋值几次):

class SingleInstanceTest {
static let sharesdInstance = SingleInstanceTest()
private override init() {
// 注册通告等关开头化操作
}
}

  • CGSize、CGPoint、CGRect 的make方法裁撤,要求运用CGSize(width: 1,
    height: 1)等方法开创
  • 不少原先的方式如systemFontOfSize都将最终的单词变为方法的表面参数名:UIFont.systemFont(ofSize:
    kGlobalFontSize_H)
  • UIColor等门类的类措施都成为静态属性:

UIColor.redColor() -> UIColor.redColor
UIColor.clearColor() -> UIColor.clearColor

  • 绘图直线等CoreGraphics操作由事先的CGPathMoveToPoint、CGPathAddLineToPoint变为path.move、path.addLine等,参数不变(半数以上CoreGraphics的格局调用都显示更swift化,可以查阅相关文档)。
  • 假使格局包罗再次回到值,例如

func sum(a: Int , b: Int) -> Int {
return a + b
}

如果不须要再次回到值可以透过 _ = sum(a: 5 , b: 6)来避免警告。

  • String与NSString必须出示转换例如,如下代码会报错:

func say(a: NSString) {
print(a)
}
var d : String = “hello”
say(a: d)

此刻要求将变量d显式转换为NSString

  • NSDateFormatter、NSNumberFormatter、NSBundle等被彻底甩掉,必要运用DateFormatter和NumberFormatter、Bundle等替代,同时苹果推出Date、Data、Calendar等swift类型(去OC化正在紧张进行中,如若苹果推出新的swift类型可以替代OC,可能会将原OC类型禁用掉,那么为了未来swift升级下落代码的修改量,提出使用swift的项目)。
  • GCD更swift化,swift3.0中可以利用DispatchQueue获取主线程、global线程或者成立单独的线程,线程任务的付出能够通过DispatchQueue的asyn、syn等(注意:通过点名线程优先级获取的global线程方法已经快要扬弃,可以透过动用global(qos:_)->DispatchQueue创建)。
  • swift
    3.0中对数组的操作例如:插入、删除、判断是或不是含有的相关方法更简洁:insert(:
    , at:)、remove(at: )、contains(
    : )
  • swift 3.0中收获类的称呼(类型)须求经过 type(of:
    _)方法赢得,如下代码所示:

class Person {
class func className() -> String {
return String(describing: self)
}
func typeS () -> String {
return String(describing: type(of: self))
// type(of: _)相当于dynamicType
}
func typeO () -> Person.Type {
let c = type(of: self)
return c
}
}
var c = Person().typeS()
var d = Person.className()
var o = String(describing: Person().typeO())

  • swift3.0 中
    UIControl的情状(诺玛l、Disable、Highlight等)被包裹到一个结构体中,并且该结构体已毕了OptionSet协议,该协议用于掩码运算(注意:xCode会自动将.normal状态变为UIControlState(),可以修改为.normal)。
  • swift3.0 的取余运算:在xcode转换swift版本时,会将取余运算符%
    变为truncatingRemainder(dividingby:_),进入文档看了弹指间swift3.0的标准库中多了成百上千的算数方法。
  • swift3.0布告变更,通知主旨由NSNotificationCenter 变为
    NotificationCenter,并且post与addObject方法中的key参数由NSNotification.Name代替,变化如下所示:

    // swift 2
    NSNotificationCenter.defaultCenter().postNotificationName(“kLogoutNotification”, object: nil)
    // swift 3
    NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: “kLogoutNotification”), object: nil)

  • swift
    3.0主意外参的转移,首个参数也急需指定一个外参数(外参数为调用处显示的参数,内参数是在函数内选拔的参数),借使不指定外参数,需求有通配符替代,代码如下所示:

// swift 2 的写法,方法首个外参数,可以不要求体现给出
func Say(p: Int , two: Int , _ three: Int) {
print(“(p)”)
print(“(two)”)
print(“(three)”)
}
// swift 3 的写法,必须出示给出第二个参数的外参数,否则编译报错
func Say(_ p: Int , two: Int , _ three: Int) {
print(“(p)”)
print(“(two)”) // 第四个参数two可同时做内参数与外参数
print(“(three)”) // 通配符代替第几个参数,调用处能够不出示外参数
}
Say(p: 0, two: 1, 2) //

  • swift 3.0
    枚举的变通,xCode升级swift时,会将有所的枚举类型的值得首字母变为题写(不强制,最好仍旧遵从这一个规则进行编码),代码如下:

enum SchoolRange: Int {
case default = 1
case province
case city
case nation
func title() -> String {
switch self {
case .province:
return “省级”
case .city :
return “市级”
case .nation:
return “国家级”
default:
return “县级”
}
}
}

  • swift3.0中的泛型可以得到OC中泛型的体系,假设在OC中利用了泛型,那么在swift与OC的混编中,swift可以测算泛型占位符的类型,如下代码所示。

    // OC 泛型定义
    // OC 代码
    @interface Person
    {

    id _typeCode;
    

    }

    • (T)typeCode;
      @end
      @interface Student
    • (Person)typeCodeSchool;
      @end
      // swift 2.2
      var s: Student = Student()
      var c = s.typeCodeSchool() //c的体系为Person
      // swift 3.0
      var s: Student = Student()
      var c = s.typeCodeSchool() //c的品类为 Person
  • private 和
    fileprivate:在swift3中private的成效域收缩了,仅能在近来的大括号内被访问,而fileprivate仅能在眼前文件中被访问,如下代码所示

    // swift 2中 同一文件可以访问private标记的变量
    class Person {

    private var name: String!
    

    }
    class Student {

    func testPer(p: Person) {
        p.name = "Hello"   // swift 2中private标记的变量,可以被同一文件内的任何类、方法访问
    }
    

    }
    // swift 3中private标记的变量只可以被{}中的方法等做客
    class Person {

    private var name: String!
    fileprivate var age: Int!
    

    }
    class Student {

    func testPer(p: Person) {
        p.age = 32  // swift3中fileprivate标记的变量可以在本文件中的任何位置访问
        p.name = "Hello"   // 此处编译错误
    }
    

    }

  • swift3.0中的Bool类型的变量名前都加上了is如isEnable、isHidden等

  • swift3.0中新增open关键字,被open标记的变量可以被分化的module的类继承、重写,public标记的变量或者类能够被当下module的类继承、重写,默许景况下internal不可以被接续或者重写。
  • swift3.0中的逃逸闭包,假如闭包被视作参数传递到函数时,该闭包不要求马上施行而是必要等一些线程落成职务之后再履行,那么须求在该闭包前加上@escaping,否则编译器报错。如下代码所示:

//以下函数是当动画页面动画为止之后执行一个闭包
func animationAfter(completion: @escaping () -> Void) {
UIView.animate(withDuration: 0.3, animations: {
// do some animation
}) { (isCom) in
completion()
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图