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

时间:2017-12-27 21:50:06

标签: objective-c swift xcode bridging-header

我必须做一个按位操作,由于某种原因只能在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

快速使用:

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

如果可以将其简化为喜欢,那就太好了 MTLTexReadAndWrite好像它是一个常数,或者可能有它,以便我可以Bridge().readAndWrite()所以这一切都在一条线上?

1 个答案:

答案 0 :(得分: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