欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

swift Tips

程序员文章站 2022-07-02 19:20:38
...

长期更新

  1. 在 Swift 4 中,默认情况下所有的 Swift 方法在 Objective-C 中都是不可见的,所以你需要在这类方法前面加上 @objc 关键字,将这个方法暴露给 Objective-C,才能进行使用。

  2. 在 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)
复制代码
  1. 方法强制转换
func commonFunc() {}

func commonFunc(a: Int) -> Int {}

let method1 = #selector(commonFunc as ()->())
let method2 = #selector(commonFunc as (Int)->Int)
复制代码
  1. 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 的方式初始化一次

  1. cpu架构
类型 arm arm64 i386 x86_64
真机 32位 64位
模拟器 32位 64位
  1. 项目初始化 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)
)

复制代码