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

Posted

技术标签:

【中文标题】从 Objective-C 向 Swift 公开一个常量变量【英文标题】:Expose a constant variable from Objective-C to Swift 【发布时间】:2017-12-27 21:50:06 【问题描述】:

我必须进行按位运算,由于某种原因只能在 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 中几乎任何事情都可以在 ObjectiveC 中完成,反之亦然。你认为在 Swift(或 ObjectiveC)中需要做什么? 这闻起来像XY problem。是否需要从both Swift ObjC 读取该值?还是仅来自其中一个?如果只有一个,哪个? “出于某种原因,只能在 swift 中实现”是什么意思? 【参考方案1】:

如果你想把它暴露给 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

【讨论】:

有点想你应该把“但我想知道你为什么不这样做”部分移到顶部。我怀疑 OP 只是遇到了一些奇怪的小问题,然后掉进了一个兔子洞。 我怀疑你是对的,但我不想假设。我试图采取“OP 必须有充分的理由去做他/她所做的事情”的慈善立场,除非另有证明。另外,以防未来读者来这里寻找真正的“将一个常量变量从 Objective-C 暴露到 Swift”的问题,我想回答标题的问题。 好的,很公平。 :) 我非常感谢您展示了 Objective-c 解决方案以及我应该使用的正确快速解决方案。谢谢!

以上是关于从 Objective-C 向 Swift 公开一个常量变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用objective-c向接口公开自定义初始化实现?

从Objective-C向Swift转换学习到的经验

从 swift 或 Objective-c 向 js 发送事件

如何从 Swift 扩展访问 Objective-C 类的私有成员?

归档发布时,通过桥接头暴露的 Objective-c 类在 swift 中不可见

从objective-c++调用swift函数