将一个常量变量从Objective-C暴露给Swift

问题描述 投票:1回答:1

我必须做一个按位操作,由于某些原因只能在swift中使用,所以我想用Objective-C初始化一些常量,以便在我的应用程序中使用。

我对Objective-c并不是那么好,所以我知道如何做到这一点的唯一方法是创建一个类并给它一个返回值的方法,但我认为有一个更有效的值。

必须有一种更简洁的方法来实现这一目标。目前我正在做以下事情:

标题:

#import <Foundation/Foundation.h>
#include <simd/simd.h>
#import <MetalKit/MetalKit.h>
#import <Metal/Metal.h>

@interface Bridge:NSObject

 @property NSString *url;

 - (MTLTextureUsage)readAndWrite;

@end

执行:

#import "MPS-Bridging-Header.h"

@implementation Bridge

- (MTLTextureUsage)readAndWrite {
    return MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget | MTLTextureUsageShaderWrite;
}

@end

Swift用法:

let bridge = Bridge()
Texture.usage = bridge.readAndWrite()

如果这可以被简化为像MTLTexReadAndWrite一样简化,就像它是一个常数,或者可能拥有它,以便我可以做Bridge().readAndWrite()所以它都在一条线上?

objective-c swift xcode bridging-header
1个回答
2
投票

如果你想将它暴露给Swift,我会定义一个类属性:

//  Bridge.h

@import Foundation;
@import Metal;

@interface Bridge : NSObject

@property (class, nonatomic, readonly) MTLTextureUsage readAndWrite;

@end

//  Bridge.m

#import "Bridge.h"

@implementation Bridge

+ (MTLTextureUsage)readAndWrite {
    return MTLTextureUsageShaderRead | MTLTextureUsageRenderTarget | MTLTextureUsageShaderWrite;
}

@end

然后你可以像这样使用它:

let readAndWrite = Bridge.readAndWrite

但我想知道你为什么不在Swift中定义这个常量:

let readAndWrite: MTLTextureUsage = [.shaderRead, .renderTarget, .shaderWrite]

如果你需要在Objective-C和Swift中使用相同的常量,请使用上面的桥接模式,但是如果你只需要它在Swift中,那么我只需在那里定义它并完全消除Bridge

© www.soinside.com 2019 - 2024. All rights reserved.