swift 文章收集@IT·互联网ios开发

Swift 3.0 项目升级实战

2017-02-06  本文已影响762人  效宇笑语

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() {
// 注册通知等关初始化操作
}
}

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

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

如果不需要返回值可以通过 _ = sum(a: 5 , b: 6)来避免警告。

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

此时需要将变量d显式转换为NSString

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())

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

// 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) //

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 "县级"
}
}
}

// OC 泛型定义
// OC 代码
@interface Person<T>
{
    id _typeCode;
} 
- (T)typeCode;
@end
@interface Student 
- (Person<School>)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<School>
// 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"   // 此处编译错误
    }
}

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

上一篇下一篇

猜你喜欢

热点阅读