公开一个从 Objective-C 到 Swift 的常量变量

Expose a constant variable from Objective-C to Swift

我必须执行按位运算,由于某种原因只能在 swift 中进行,因此我希望使用 Objective-C 初始化一些常量以在我的应用程序中使用。

我对 objective-c 不是很好,所以我知道如何做到这一点的唯一方法是创建一个 class 并给它一个 returns 值的方法但是我认为有一个更有效的值。

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

Header:

#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()

如果能简化成like就好了 MTLTexReadAndWrite 就好像它是一个常量,或者也许有它,这样我就可以做到 Bridge().readAndWrite() 所以它都在一条线上?

如果您想将其公开给 Swift,我会定义一个 class 属性:

//  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