13.OC和Swift混编

2020-05-06  本文已影响0人  迷心迷

OC 和 Swift 运行时简介

Objective-C 运行时
02

派发方式

直接派发
函数表派发

消息机制派发

Swift 运行时

06

Swift 运行时-final @objc

07 08

桥接

09 10 11 12

相互调用

Swift 调用 OC
 // C语言
int sum(int a, int b) {
return a + b; 
}
 // Swift
@_silgen_name("sum") func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32 
print(swift_sum(10, 20)) // 30
print(sum(10, 20)) // 30
13
OC 调用 Swift
//使用@objcMembers修饰类
//代表默认所有成员都会暴露给OC(包括扩展中定义的成员)
//最终是否成功暴露,还需要考虑成员自身的访问级别
@objcMembers class Car: NSObject {
    var price: Double
    var band: String
    init(price: Double, band: String) {
        self.price = price
        self.band = band
    }
    func run() {
        print(price, band, "run")
    }
    static func run() { print("Car run") }
}
extension Car {
    func test() { print(price, band, "test") }
}
  @objc(MJCar)
@objcMembers class Car: NSObject {
var price: Double
@objc(name)
var band: String
init(price: Double, band: String) {
self.price = price
self.band = band }
@objc(drive)
func run() { print(price, band, "run") } static func run() { print("Car run") }
}
extension Car {
    @objc(exec:v2:)
func test() { print(price, band, "test") } }
MJCar *c = [[MJCar alloc] initWithPrice:10.5 band:@"BMW"]; c.name = @"Bently";
c.price = 108.5;
[c drive]; // 108.5 Bently run
[c exec:10 v2:20]; // 108.5 Bently test [MJCar run]; // Car run
14 15

NS_SWIFT_NAME

NS_SWIFT_UNAVAILABLE

采坑指南

Subclass

Swift 独有特性

NS_REFINED_FOR_SWIFT

知识点

// MARK: 类似于OC中的 #pragma mark
// MARK: - 类似于OC中的 #pragma mark -
// TODO: 用于标记未完成的任务
// FIXME: 用于标记待修复的问题

条件编译
func log<T>(_ msg: T,
            file: NSString = #file,
            line: Int = #line,
            fn: String = #function) {
    #if DEBUG
    let prefix = "\(file.lastPathComponent)_\(line)_\(fn):"
    print(prefix, msg)
    #endif
}

API可用性

@available(iOS 10, macOS 10.15, ) class Person {}
struct Student {
@available(
, unavailable, renamed: "study")
func study_() {}
func study() {}

@available(iOS, deprecated: 11)
@available(macOS, deprecated: 10.12)
func run() {}
}

参考: https://docs.swift.org/swift-book/ReferenceManual/Attributes.html

@objc(MJCar)
@objcMembers class Car: NSObject {
      var price: Double
      @objc(name)
       var band: String
       init(price: Double, band: String) {
              self.price = price
              self.band = band
       }
        @objc(drive)
         func run() { print(price, band, "run") } 
        static func run() { print("Car run") }
}
extension Car {
        @objc(exec:v2:)
        func test() { print(price, band, "test") } }

 @objcMembers class Person: NSObject {
          func test1(v1: Int) { print("test1") }
          func test2(v1: Int, v2: Int) { print("test2(v1:v2:)") }
          func test2(_ v1: Double, _ v2: Double) { print("test2(_:_:)") } 
          func run() {
                    perform(#selector(test1)) perform(#selector(test1(v1:)))                   
                    perform(#selector(test2(v1:v2:)))       
                    perform(#selector(test2(_:_:))) 
                    perform(#selector(test2 as (Double, Double) -> Void))
          } 
}
关联对象(Associated Object)

class Person {}
extension Person {
private static var AGE_KEY: Void?
var age: Int {
get {
(objc_getAssociatedObject(self, &Self.AGE_KEY) as? Int) ?? 0
}
set {
objc_setAssociatedObject(self, &Self.AGE_KEY,newValue, .OBJC_ASSOCIATION_ASSIGN)
}
}
}

var p = Person()
print(p.age) // 0
p.age = 10
print(p.age) // 10

上一篇 下一篇

猜你喜欢

热点阅读