2016-08-10 6 views
1

このコードをSwiftに変換したい。ここでのObjective-Cコードは、シングルトンオブジェクトを作成しています(私がそのように記述できる場合)。 dispatch_once_tを使用して変換することはできますが、「static let bundle:NSBundle!」と似たようなより洗練された方法を使用します。しかし、 "static let bundle:NSBundle!"は、格納されたプロパティを許可していないので、拡張子では使用できません。どのようにしてシングルトンを作るためにクラスエクステンションにスタティック(ストアド)プロパティを追加できますか? (Swift)

dispatch_once_tなしでコードを変換することは可能ですか?

そして私は、私はクラス拡張

@implementation NSBundle(CTFeedback)にプロパティを格納していないという問題に直面した

+ (NSBundle *)feedbackBundle 
{ 
    static NSBundle *bundle = nil; 
    static dispatch_once_t predicate; 

    dispatch_once(&predicate, ^{ 
     NSBundle *classBundle = [NSBundle bundleForClass:[CTFeedbackViewController class]]; 
     NSURL *bundleURL = [classBundle URLForResource:@"CTFeedback" withExtension:@"bundle"]; 

     if (bundleURL) { 
      bundle = [NSBundle bundleWithURL:bundleURL]; 
     } else { 
      bundle = [NSBundle mainBundle]; 
     } 
    }); 

    return bundle; 
} 

@end 

マイスウィフトコード:

extension NSBundle 
{ 
    static func feedbackBundle()-> NSBundle 
    { 
     static let bundle: NSBundle! //!! **Compiler Error here** 

     let classBundle = NSBundle.init(forClass: CTFeedbackViewController.self) 
     let bundleURL = classBundle.URLForResource("CTFeedback", withExtension: "bundle") 

     if let bundleURL2 = bundleURL 
     { 
      bundle = NSBundle(URL: bundleURL2) 
     } 
     else 
     { 
      bundle = NSBundle.mainBundle() 
     } 

     return bundle; 
    } 
} 

更新:

人々のおかげで、私は今これが好きです。私は

private class FeedbackBundle 
{ 
    static let classBundle = NSBundle.init(forClass: CTFeedbackViewController.self) 
} 

extension NSBundle 
{ 
    static func feedbackBundle()-> NSBundle 
    { 
     let bundleURL = FeedbackBundle.classBundle.URLForResource("CTFeedback", withExtension: "bundle") 
     if let bundleURL2 = bundleURL 
     { 
      return NSBundle(URL: bundleURL2)! 
     } 
     else 
     { 
      return NSBundle.mainBundle() 
     } 
    } 
} 
+0

エラーとは何か、おそらく 'self'で試してみる – meda

答えて

0

は、あなたはいつも別のクラスまたは(静的変数はとにかくです)シンプルなグローバル変数のいずれかとして、静的varは延長の外部に存在するかもしれない/それが最善の方法だと確認していません。例えば

:スウィフトで

private class FeedbackBundle 
{ 
    static var bundle: NSBundle! 
} 

extension NSBundle 
{ 
    static func feedbackBundle()-> NSBundle 
    { 
     let classBundle = NSBundle.init(forClass: CTFeedbackViewController.self) 
     let bundleURL = classBundle.URLForResource("CTFeedback", withExtension: "bundle") 

     if let bundleURL2 = bundleURL 
     { 
      FeedbackBundle.bundle = NSBundle(URL: bundleURL2) 
     } 
     else 
     { 
      FeedbackBundle.bundle = NSBundle.mainBundle() 
     } 

     return FeedbackBundle.bundle; 
    } 
} 
+1

どのようなシングルトンパターンですか?常にあなたは 'FeedbackBundle.bundle'を再割り当てします。 – Avi

+0

シンプトンの "FeedbackBundle"に "bundle"を付けると、feedbackBundleもシングルトンになります。 私は "静的letバンドル:NSBundle!="で始まっています。 – allenlinli

+0

また、FeedbackBundleでシングルトンの値を作成することは解決策です... – allenlinli

1

、あなたは拡張で静的変数を追加することはできません。 アクセス可能であれば元のクラスで再試行できます。それ以外の場合は、次のようにコードを変更できます。

if let bundleURL2 = bundleURL 
{ 
    return NSBundle(URL: bundleURL2) 
} 
else 
{ 
    return NSBundle.mainBundle() 
} 
+0

合理的に聞こえます。 – allenlinli

0

NSBundleをサブクラス化してこのプロパティを追加することもできます。

+0

私は拡張メソッドを使いたいという意図を壊しているので、私はサブクラスを好むわけではありません。とにかくありがとうございました:) – allenlinli

関連する問題