신속한 오류 : 'centralManager'사용은 모듈에서 var 'centralManager'가 아닌 인스턴스 메서드를 참조합니다.

Nov 18 2020

func run_central ()을 사용하여 .swift 파일이 포함 된 Obj-C 정적 라이브러리를 가져 오는 Obj-C 앱이 있습니다.

앱에서 run_central ()을 참조하고 빌드 오류를 얻을 수 없습니다.

다음은 Obj-C 앱 프로젝트와 가져온 Obj-C 정적 라이브러리 Hub_lib이며 .swift 파일도 포함 (즉, 가져 오기)합니다 ....

ObjC app project has this file........

ViewController.mm  .....................     (is .mm because it imports C++ lib)

. . .


- (IBAction)run_simple_central:(id)sender 
{
    Hub_lib* hub_lib = [Hub_lib new];
    [hub_lib run_central]; <<<<<<<<<<<<<  No visible @interface for Hub_lib' declares the selector 'run_central'
}

@end


ObjC static library Hub_lib project has these files........  

Hub_lib-Bridging-Header.h  ............................  <<<<<<<<<<<<<<<<<<   EMPTY -- NO CODE
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

BLE.swift file ..........................

import UIKit
import CoreBluetooth
import os

var centralManager: CBCentralManager?

class BLE_Central: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate
{
. . .
    public func run_central()   // <<<<<<<<<<<<<<<<<<<  THE FUNCTION
    {
        Hub_lib.centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionShowPowerAlertKey: true])
    }

답변

1 OlSen Nov 19 2020 at 10:04

swift 의 액세스 제어 키워드 publicfunc run_central() 은 프로젝트의 Objective-c에서 그대로 사용할 수 없습니다 . swift 모듈에서 함수의 액세스 수준을 제어 할 수 있습니다.
docs.swift.org-프레임 워크에 대한 액세스 수준

프레임 워크를 개발할 때 프레임 워크 를 가져 오는 앱과 같은 다른 모듈 에서 보고 액세스 할 수 있도록 해당 프레임 워크에 대한 공개 인터페이스를 공개 또는 공개 로 표시합니다.

프레임 워크를 대상으로하는 프로젝트에서 사용되는 경우 ( public ) 생성 된 헤더 파일에 함수를 게시해야합니다. Apple Docs-프레임 워크 대상 내에서 코드 가져 오기

에 대한 지시 사항을 따라 오브젝티브 C로 해소하는 것은 ,
당신의 기능을 사용할 수 있도록하려면 통해 노출 할 필요가 objc

@objc public func run_central() { /* ... */ }

이를 통해 Objective-C 내에서 NSObject상속 된 신속한 클래스 를 호출 할 수 있습니다.BLE_Central

BLE_Central *ble = [BLE_Central new];
[ble run_central];

이제 이를 선언하는 헤더에 대한 지식이없는 프로젝트 에서 공개 되지 않았거나 objc 를 통해 신속하게 노출 class BLE_Central되지 않기 때문에 어려움 이 발생합니다. 당신이해야 할 단서로 이끄는

#import <Hub_lib/Hub_lib-Swift.h>

프레임 워크 또는 모듈을 사용하는 프로젝트의 콘텐츠를 선언합니다. 명명 규칙에서 가져 오기 규칙이 다음과 같아야한다고 말하는 경우 ...

#import <ProductName/ProductModuleName-Swift.h>

추신 : objc 는 동일한 프로젝트에서
object -c에 함수 또는 클래스를 노출하지만 nonobjc 는 반대의 .

nonobjc 속성은 Objective-C에서 선언이 가능하더라도 Objective-C 코드에서 선언을 사용할 수 없도록 컴파일러에 지시합니다.