没有已知的选择器“名称”的类方法

时间:2019-10-04 09:24:46

标签: ios objective-c swift xcode

enter image description here我有两个文件,其中一个名为CodeInjection.m,内容类似于

#import <Foundation/Foundation.h>
#import "Someheaderfile.h"


@interface CodeInjection: NSObject
@end

@implementation CodeInjection

static void __attribute__((constructor)) initialize(void){
    NSLog(@"==== Code Injection in Action====");
    [[CodeInjectionSwift shared] performTask];
}

@end

然后我有一个包含内容的CodeInjectionSwift.swift文件

import Foundation
import NetworkInterceptor

@objc class CodeInjectionSwift: NSObject {
    @objc public static let shared = CodeInjectionSwift()

    override private init(){}

    @objc func performTask(){
        let requestSniffers: [RequestSniffer] = [
            RequestSniffer(requestEvaluator: AnyHttpRequestEvaluator(), handlers: [
                SniffableRequestHandlerRegistrable.console(logginMode: .nslog).requestHandler()
                ])
        ]

        let requestRedirectors: [RequestRedirector] = [
            RequestRedirector(requestEvaluator: DomainHttpRequestEvaluator(domain: "www.antennahouse.com"), redirectableRequestHandler: AlternateUrlRequestRedirector(url: URL(string: "https://www.rhodeshouse.ox.ac.uk/media/1002/sample-pdf-file.pdf")!))
        ]

        let networkConfig = NetworkInterceptorConfig(requestSniffers: requestSniffers,
                                                     requestRedirectors: requestRedirectors)
        NetworkInterceptor.shared.setup(config: networkConfig)
        NetworkInterceptor.shared.startRecording()
    }
}

尝试使用“ CodeInjectionSwift”时,出现类似错误

enter image description here

2 个答案:

答案 0 :(得分:0)

@objc func performTask()设为公开: @objc public func performTask()

答案 1 :(得分:0)

我的原始答案是错误的。我将其留在下面以供参考。

实际上,整个问题是您需要将一个特殊的标头导入到Objective-C类中。

    #import "TestImportSwift-Swift.h"

其中TestImportSwift被项目名称替换。


错误的旧答案

shared不是class成员,而是static成员。不幸的是,Swift不支持类变量,仅支持函数,因此您可以尝试

@objc class CodeInjectionSwift: NSObject {

    static let _shared = CodeInjectionSwift()
    @objc public class func shared() -> CodeInjectionSwift { return _shared }

    // Rest of the class

请注意,我尚未在实际项目中尝试过此操作。