2016-03-30 10 views
1

私は、問題は、私は可変引数のparamsでは不可能であるObjective Cの中で、この方法を利用できるようにする必要があるということです以下の方法スウィフトambiguos方法

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

を持っています。私がしようとしたのは、paramsが配列である目的の別のメソッドを作成することです。しかし、私はまた、paramsがないときのために3番目のものを持っている必要があります。

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

しかし、今スウィフトは第一と第三の方法は、単にキーを取ることができますので、この方法tがあいまいであることを不平を言います。

この作品を作成するには?私は別の名前を使うことができることを知っていますが、私は物事を一貫させておきたいと思います。

更新: もう1つの問題は、paramsが配列であり、paramsのグループではないため、String(format:...)を関数内で正しく呼び出すことができないことです。これを解決する良い方法はありますか?

答えて

1

次の操作を行うことができます

@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_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 

、次のようにメッセージとして送らすることができますが、次のよう

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

これが架設されています:

質問への更新について210

は、むしろCVarArgType...より[CVarArgType]をとりフォーマットさString初期化子のバージョンがあります:

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])を使用する必要がある場合や、私は、次の濁ったコードのラインに沿ってCVarArgType秒にAnyObject sからキャストを避けるためにどのように現時点で表示されていないのObjective Cからそれを取得:

@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) 
    } 
} 

私の提案は*あなたが*スウィフトから追加のパラメータを指定せずにメソッドを呼び出したときに、質問で述べたように

+0

は、問題が発生した... String.init(format: String, arguments: [CVarArgType])のようなものをオフに離乳するか、またはObjective Cの中に基本メソッドを実装することです、例えば'let foo = C.t(" bar ")'を実行します。 –

+0

はい、もちろん、マーティン、ありがとう!私は答えを修正しました... – milos

+0

恐ろしい!それがきれいになりたいと思っています:)しかし、それは動作します! –

関連する問題