Swift OC互调

2019-08-06  本文已影响0人  曹来东
let p = LDPerson(age: 10, name: "Jack")
 p.age = 18
 p.name = "Rose"
 p.run()//Person - Run 对象方法
 p.eat("Apple", other: "Other")//-eat Apple Other 对象方法
 LDPerson.run()//Person + Run 类方法
 LDPerson.eat("Apple", other: "Other")//+eat Apple Other 类方法
 print(sum(10, 20))// 30

@_silgen_name

import UIKit
@_silgen_name("sum") func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32
//Swift函数
func sum(_ a: Int, _ b: Int) -> Int { a - b }

class HomeViewController: UIViewController {
    override func viewDidLoad() {
      print(sum(10, 20))
      print(swift_sum(10, 20))
    
    } 
}

OC调用Swift

import UIKit

@objcMembers class LDCar: 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("LDCar run") }
 
}

extension LDCar {
    func test() {
        print(price, band, "test")
    }
}
SWIFT_CLASS("_TtC12SwiftProject5LDCar")
@interface LDCar : NSObject
@property (nonatomic) double price;
@property (nonatomic, copy) NSString * _Nonnull band;
- (nonnull instancetype)initWithPrice:(double)price band:(NSString * _Nonnull)band OBJC_DESIGNATED_INITIALIZER;
- (void)run;
+ (void)run;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end


@interface LDCar (SWIFT_EXTENSION(SwiftProject))
- (void)test;
@end

OC调用Swift-OC代码

image.png
int sum (int a, int b){
    LDCar* car = [[LDCar alloc] initWithPrice:10.5 band:@"BWM"];
    car.band = @"Bently";
    car.price = 108.3;
    [car run];//108.3  Bently run  
    [car test];//108.3  Bently test  分类方法
    return a + b;
}

import UIKit
//给LDPerson中的sum函数重命名,因为OC文件中的sum函数和Swift中的sum函数同名,
//调用会引起二义性
@_silgen_name("sum") func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32
//Swift函数
func sum(_ a: Int, _ b: Int) -> Int { a - b }

class HomeViewController: UIViewController {
    override func viewDidLoad() {
      
      print(swift_sum(10, 20))
    
    } 
}

-@objc

import UIKit
@objc(LDRenameCar)
@objcMembers class LDCar: 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("LDCar run") }
 
}

extension LDCar {
    //error:
    //'@objc' method name provides names for 2 arguments, but method has 0 parameters
    @objc(exec:v2:)
    func test() {
        print(price, band, "test")
    }
}

//重命名后 属性 方法名改变
int sum (int a, int b){
    LDRenameCar* car = [[LDRenameCar alloc] initWithPrice:10.5 band:@"BWM"];
    car.name = @"Bently";
    car.price = 108.3;
    [car drive];//108.3  Bently run
    [car exec];//108.3  Bently test  分类方法
    return a + b;
}

选择器(Selector)

import UIKit
@objcMembers class LDCar: 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))
    }
}

int sum (int a, int b){
    LDCar * car = [[LDCar alloc] init];
    [car run];
    
    return a + b;
}

import UIKit
//给LDPerson中的sum函数重命名,因为OC文件中的sum函数和Swift中的sum函数同名,
//调用会引起二义性
@_silgen_name("sum") func swift_sum(_ v1: Int32, _ v2: Int32) -> Int32
//Swift函数
func sum(_ a: Int, _ b: Int) -> Int { a - b }

class HomeViewController: UIViewController {
    override func viewDidLoad() {
      
      print(swift_sum(10, 20))
    
    } 
}
上一篇 下一篇

猜你喜欢

热点阅读