美文网首页
OC和Swift混编遇到的一些小麻烦

OC和Swift混编遇到的一些小麻烦

作者: Sweet丶 | 来源:发表于2021-09-09 16:42 被阅读0次
    一. OC中调用swift类中的方法时,编译器有时找不到方法声明
    OC调用swift类中的方法,swift类需要有以下几个规则:
    1. swift类需要最终继承NSObjct, 并且类中提供给OC调用的方法需要添加@objc声明。
    2. @objc声明的方法可以是swift的对象方法,也可以是类型方法(包括static、class声明的方法)
    3. 使用@objc(methodName:)给方法起别名时,括号中的就是OC调用时的方法名。具体如下:
    extension UIImage {
        ///1. OC调用时方法名compressToByte:
        @objc(compressToByte:) func compress(toByte maxLength: Int) -> Data? {
            return Data()
        }
        
        ///2. OC调用时方法名compress2ToByte:
        @objc func compress2(toByte maxLength: Int) -> Data? {
            return Data()
        }
        
        ///3. OC调用时方法名compress3WithMaxLength:
        ///这里因为没有自定义参数标签toByte,所以编译器自动追加了with
        @objc func compress3(maxLength: Int) -> Data? {
            return Data()
        }
    }
    
    1. 使用@objcMembers标明一个继承自NSObject的swift类时,类中的方法都默认有@objc的效果。
    @objcMembers class Myclass : NSObject{
        func test() {// OC可以调用test
        }
        
        static func testClassMethod(){// OC可以调用testClassMethod
        }
    }
    
    二.CFRelease(source)

    swift文件中,使用了C语言函数的create\copy\malloc,不需要手动写CFRelease(source)、free()之类的了。

    三. 元组、枚举关联值、inout关键字在OC中不支持

    在swift方法中如果参数或者返回值类型是OC中不支持的类型(元组、枚举关联值、inout关键字等),那么这个方法是不能与OC混编的。

    四. do...try...catch

    在OC中可以使用下面方式捕获系统调用方法时可能发生的异常:

    // 保证只添加一次contentOffset观察
        @try {// 1.首先会来到这里
            [self.scrollView removeObserver:self forKeyPath:@"contentOffset"];
        } @catch (NSException *exception) {// 2.如果发生异常会来到这里
            NSLog(@"页面没有添加对scrollView.contentOffset的KVO观察");
        } @finally {// 3.不管有没有发生异常,最终会来到这里
            [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:nil];
        }
    
    

    在swift中调用有throws关键字标明的方法时,需要捕获异常,方法如下:

    // 方式一:do{ try ...} catch {}
    do {
        let data = try JSONSerialization.data(withJSONObject: dictionary, options: [])
    } catch let error as NSError {
        print(error)
    }
    // 方式二:try! 此方式调用方法时有异常时奔溃,无异常时是解包后的值
     let data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
    // 方式三: try? 此方式调用方法后返回值是可选类型,有异常时是nil
    let data = try? JSONSerialization.data(withJSONObject: dictionary, options: [])
    

    相关文章

      网友评论

          本文标题:OC和Swift混编遇到的一些小麻烦

          本文链接:https://www.haomeiwen.com/subject/vmjvvltx.html