Могу ли я расширить класс NSString в статической библиотеке и использовать его в приложении с помощью Swift?

Я расширяю NSString в своей пользовательской статической библиотеке CommonLib:

//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-Bridging-Header.h в проекте CommonLib:

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

Затем я связываю CommonLib с моим проектом приложения и создаю новый файл 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!!!
}

На данный момент компилируется нормально!!! Но когда я запускаю приложение, оно вылетает:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[Swift._NSContiguousString isContainsEmoji]: нераспознанный селектор отправлен экземпляру 0x60400084b340»

Так что тут что-то не так??? И как исправить??? Спасибо ;)

(PS: моя среда Xcode 9.3.1 swift 4.1)


comment
У вас не может быть мостовых заголовков в библиотеках, это означает, что вы можете использовать swift из Objective-C, но не наоборот.   -  person Mgetz    schedule 24.05.2018
comment
вы имеете в виду удалить файл заголовка моста, и он будет работать ???   -  person hopy    schedule 24.05.2018
comment
Более того, у вас может быть соединительный заголовок, он просто игнорируется в статической или динамической библиотеке. Библиотеки и платформы не поддерживаются для смешанных Objective-C и Swift. Мне буквально сказал об этом один из разработчиков Apple.   -  person Mgetz    schedule 24.05.2018
comment
спасибо, а как исправить???   -  person hopy    schedule 24.05.2018
comment
Вы можете использовать отдельные фреймворки для компонентов Swift и Objective-C. Или вы можете сделать так, чтобы Objective-C вызывал только Swift и никогда наоборот. Вы можете обойти это, используя динамическое создание экземпляров и используя протоколы, определенные в swift... но будьте осторожны с возникающими проблемами с подсчетом ссылок.   -  person Mgetz    schedule 24.05.2018


Ответы (1)


Наконец, я рад исправить этот вопрос ;)

Это очень просто, добавьте опцию ссылки в проект приложения:

-all_load

Все в порядке, вы можете обратиться к этому:

неопознанный селектор отправлен экземпляру" в статическая библиотека, несмотря на флаг ObjC

Всем спасибо ;)

person hopy    schedule 25.05.2018