代码之家  ›  专栏  ›  技术社区  ›  hopy

我可以在静态库中扩展NSString类,并在应用程序中与Swift一起使用它吗?

  •  0
  • hopy  · 技术社区  · 6 年前

    我在自定义静态库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桥接头文件。h在CommonLib项目中:

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

    接下来,我将CommonLib链接到我的应用程序项目,并创建一个新的文件节点。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!!!
    }
    

    此时编译就可以了!!!但当我运行应用程序时,它崩溃了:

    由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[Swift.\n连续字符串IsContainesMoji]:未识别的选择器发送到实例0x60400084b340”

    这里有什么问题吗???如何修复它???谢谢;)

    (附注:我的环境Xcode 9.3.1 swift 4.1)

    1 回复  |  直到 6 年前
        1
  •  1
  •   hopy    6 年前

    最后,我很高兴修复了这个问题

    这很简单,将链接选项添加到应用程序项目:

    -全部装载

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

    unrecognized selector sent to instance” to a static library despite ObjC flag

    谢谢大家;)