You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C类中来自Swift Package的属性在Swift子类中不可见

问题描述

类层级:MySwiftSubViewController -> ViewController -> UIViewController

Objective-C父类声明

#import <UIKit/UIKit.h>

@class SwiftClassFromPackage;

@interface ViewController : UIViewController
@property (nonatomic, strong) SwiftClassFromPackage* _Nullable someSwiftObjectFromPackage;

@end

Objective-C父类实现(内部使用正常)

#import "ViewController.h"
@import MyPackage;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    _someSwiftObjectFromPackage = [[SwiftClassFromPackage alloc] init];
}
@end

Swift子类编译错误

import UIKit
import MyPackage

class MySwiftSubViewController: ViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("\(self.someSwiftObjectFromPackage.text)") 
        // 编译错误:Value of type 'MySwiftSubViewController' has no member 'someSwiftObjectFromPackage'
    }
}

单独在包外使用SwiftClassFromPackage类正常,但作为Objective-C类的属性在Swift子类中无法访问,请问原因是什么?


问题原因与解决方案

核心原因

Objective-C头文件里只用@class SwiftClassFromPackage做了前向声明,没导入该类的正式头文件,导致Swift和Objective-C的桥接器没法识别这个类型,自然不会把该属性暴露给Swift子类。

解决步骤

  1. 替换前向声明为正式导入
    修改ViewController.h,把@class SwiftClassFromPackage换成Swift包的导入语句:

    #import <UIKit/UIKit.h>
    // 替换前向声明为包导入
    #import <MyPackage/SwiftClassFromPackage.h>
    
    @interface ViewController : UIViewController
    @property (nonatomic, strong) SwiftClassFromPackage* _Nullable someSwiftObjectFromPackage;
    
    @end
    

    要是Swift包生成的是统一伞头,也可以用@import MyPackage;代替具体类的导入。

  2. 确认Swift类支持Objective-C桥接
    检查Swift包中的SwiftClassFromPackage类是否加了@objc修饰符,且继承自NSObject(或者在Package.swift里确认objcInteropEnabled = true,默认是开启的):

    @objc public class SwiftClassFromPackage: NSObject {
        public var text: String = "Hello"
        @objc public override init() {
            super.init()
        }
    }
    

    只有继承自NSObject且符合Objective-C桥接要求的Swift类,才能被Objective-C正确识别,进而让Swift子类访问到对应的属性。

补充说明

前向声明只能让Objective-C代码编译通过,但没法提供完整的类型信息。Swift桥接器需要完整的类型定义才能生成对应的Swift接口,当Objective-C头文件只有前向声明时,Swift会把该属性当成UnsafeMutableRawPointer?类型,而非实际的SwiftClassFromPackage?,所以用.语法访问成员属性会报错。

内容的提问来源于stack exchange,提问作者iljer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:07:24