长期更新
-
在 Swift 4 中,默认情况下所有的 Swift 方法在 Objective-C 中都是不可见的,所以你需要在这类方法前面加上 @objc 关键字,将这个方法暴露给 Objective-C,才能进行使用。
-
在 Swift 3 和之前的版本中,Apple 为了更好的 Objective-C 兼容性,会自动对 NSObject 的子类的非私有方法进行推断并为在幕后为它们自动加上 @objc。但是这需要每次 Swift 代码变动时都重新生成 Objective-C 所使用的头文件,这将造成 Swift 与 Objective-C 混编时速度大幅恶化。 另外,即使在 Swift 3 中,私有方法也只在 Swift 中可见,在调用这个 selector 时你会遇到一个 unrecognized selector 错误
// In Swift 3
private func callMe() {
//...
}
NSTimer.scheduledTimerWithTimeInterval(1, target: self,
selector:#selector(callMe), userInfo: nil, repeats: true)
复制代码
- 方法强制转换
func commonFunc() {}
func commonFunc(a: Int) -> Int {}
let method1 = #selector(commonFunc as ()->())
let method2 = #selector(commonFunc as (Int)->Int)
复制代码
- swift 单例
// 一般写法
class MyManager {
class var shared : MyManager {
struct Static {
static let sharedInstance : MyManager = MyManager()
}
return Static.sharedInstance
}
}
// 推荐写法
class MyManager {
static let shared = MyManager()
private init() {}
}
复制代码
对于所有的全局变量,Apple 都会在底层使用这个类似 dispatch_once 的方式来确保只以 lazy 的方式初始化一次
- cpu架构
类型 | arm | arm64 | i386 | x86_64 |
---|---|---|---|---|
真机 | 32位 | 64位 | ||
模拟器 | 32位 | 64位 |
- 项目初始化 OC 项目初始化:
// main.m
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));
}
}
复制代码
swift项目初始化:
@UIApplicationMain
复制代码
使用@UIApplicationMain
标签标注的类作为委托,创建UIApplication对象启动程序。编译时,编译器会寻找这个标签标记的类,并自动插入像main函数这样的模版代码中。
改造swift初始化代码:
// 新建 main.swift 文件
import UIKit
// 自定义application类
class MyApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
super.sendEvent(event)
print("Event sent:\(event)")
}
}
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self)
)
复制代码