0

我在自定义静态库 CommonLib 中扩展 NSString :

//NSString+ext.h
#import <Foundation/Foundation.h>

@interface NSString (ext)
- (BOOL)isContainsEmoji;
@end



//NSString+ext.m
#import "NSString+ext.h"

@implementation NSString (ext)
- (BOOL)isContainsEmoji{
    //Do Something...
}
@end

因为 CommonLib 包含一些 Swift 代码文件,所以我在 CommonLib 项目中创建了一个桥接头文件 CommonLib-Bridging-Header.h:

//in CommonLib-Bridging-Header.h
#import "NSString+ext.h"

接下来,我将 CommonLib 链接到我的 App 项目,并在 App 项目中创建一个新文件 Node.swift:

//Node.swift
import Foundation
import CommonLib

class Node{

    var name:String!
    var isBadName:Bool{
        let tmpString = name as NSString
        return tmpString.isContainsEmoji()
    }
}

最后,我在我的应用程序的某个地方使用它:

//In my UIViewController class
override func viewDidAppear(...){
    super.viewDidAppear(...)

    let node = Node()
    node.name = "panda hopy"
    print("\(node.isBadName)") //Crash in this line!!!
}

这时候编译就OK了!!!但是当我运行应用程序时它崩溃了:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Swift._NSContiguousString isContainsEmoji]:无法识别的选择器发送到实例 0x60400084b340”

所以这里有什么问题吗???以及如何解决它???谢谢 ;)

(PS:我的环境Xcode 9.3.1 swift 4.1)

4

1 回答 1

1

最后,我很高兴解决了这个问题;)

很简单,在 App 项目中添加链接选项:

-all_load

没关系,你可以参考这个:

尽管有 ObjC 标志,但将无法识别的选择器发送到实例”到静态库

感谢大家 ;)

于 2018-05-25T02:23:23.720 回答