신속한 오류 : 'centralManager'사용은 모듈에서 var 'centralManager'가 아닌 인스턴스 메서드를 참조합니다.
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])
}
답변
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 코드에서 선언을 사용할 수 없도록 컴파일러에 지시합니다.