gpt4 book ai didi

objective-c - 带有可变参数的 Swift 模糊方法

转载 作者:行者123 更新时间:2023-11-28 06:46:08 25 4
gpt4 key购买 nike

我有以下方法

static func t(key: String, params: AnyObject...) -> String{
let string = .......
if (params.count == 0){
return string
} else {
return String(format: string, params)
}
}

问题是我需要让这个方法在 Objective C 中可用,这对于可变参数是不可能的。我试图做的是为 objective-c 创建另一个方法,其中 params 是一个数组。但是当没有参数时,我还需要第三个。

@objc static func t(key: String, params: [AnyObject]) -> String
@objc static func t(key: String) -> String

但是现在 swift 提示方法 t 是模棱两可的,因为第一个和第三个方法只能使用 key 。

如何实现?我知道我可以使用不同的名称,但我希望保持一致。

更新:另一个问题是我无法在函数内部正确调用 String(format:...) ,因为 params 是一个数组而不是一组参数。有什么好的方法可以解决这个问题吗?

最佳答案

您可以执行以下操作:

@objc(C)
public class C : NSObject {

public static func t(key: String, params firstParam: AnyObject, _ params: AnyObject...) -> String {
return t(key, params: [firstParam] + params)
}

@objc
public static func t(key: String, params: [AnyObject]) -> String {
return "TODO"
}

@objc
static func t(key: String) -> String {
return t(key, params: [])
}
}

...从 Swift 调用:

C.t("")
C.t("", params: 1)
C.t("", params: 1, 2)
C.t("", params: [1, 2, 3])

桥接如下:

SWIFT_CLASS_NAMED("C")
@interface C : NSObject
+ (NSString * _Nonnull)t:(NSString * _Nonnull)key params:(NSArray * _Nonnull)params;
+ (NSString * _Nonnull)t:(NSString * _Nonnull)key;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

并且可以按如下方式发送消息:

#import "DarkSide.h"
#import "ObjCInterOp-Swift.h"

@implementation DarkSide

- (instancetype)init
{
self = [super init];
if (self) {
[C t:@"" params:@[]];
[C t:@""];
}
return self;
}
@end

关于问题的更新,有一个版本的格式化 String 初始化程序采用 [CVarArgType] 而不是 CVarArgType...:

func f(format format: String, _ params: [CVarArgType]) -> String {
return String(format: format, arguments: params)
}

f(format: "%d %d %d", [1, 2, 3]) // "1 2 3"

只有 CVarArgType 不能在 Objective C 中表示,这确实使事情变得复杂。事实上,如果你真的必须使用 String.init(format: String, arguments: [CVarArgType]) and 从 Objective C 获取它,那么我看不到如何避免从 AnyObject 转换为 CVarArgType 以及以下模糊代码:

@objc(C)
public class C : NSObject {

public static func t(key: String, params: CVarArgType...) -> String {
return t(key, params: params)
}

public static func t(key: String, params: [CVarArgType]) -> String {
return String(format: key, arguments: params)
}

@objc(t:params:)
public static func t_objc(key: String, params: [AnyObject]) -> String {
let args = params.map{
// here you'll probably need to parse `key` so as to
// know what to cast into!
($0 as! NSNumber).integerValue as CVarArgType
}
return t(key, params: args)
}

@objc(t:)
static func t_objc(key: String) -> String {
return t(key)
}
}

我的建议是要么放弃像 String.init(format: String, arguments: [CVarArgType]) 这样的东西,要么在 Objective C 中实现基本方法...

关于objective-c - 带有可变参数的 Swift 模糊方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com