2016-08-10 3 views
1

Я хочу, чтобы преобразовать этот код в Swift. Код Objective-C здесь создает одноэлементный объект (если я могу описать его как таковой). Я могу использовать dispatch_once_t, чтобы преобразовать его, но я хочу использовать более элегантный способ, который должен быть похож на «static let bundle: NSBundle!». Но «static let bundle: NSBundle!» не допускается в расширении, так как он не позволяет сохранять сохраненные свойства.Как добавить статическое (хранимое) свойство в расширение класса, чтобы сделать singleton? (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 

Мой Swift Code:

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

Вы всегда можете иметь статический вар находятся за пределами расширения, либо в отдельном классе или как простой глобальной переменной (которая статические переменные в любом случае).

, например:

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

Если я сделаю «bundle» в «FeedbackBundle» синглетоном, обратная связь также может быть синглом. Я пытаюсь начать с «статического пучка: NSBundle! = ...». – allenlinli

+0

Или, возможно, сделать одноэлементное значение в FeedbackBundle - это решение ... – allenlinli

1

В Swift, вы не можете добавлять статические переменные в расширениях. Если доступно, вы можете выполнить повторный запуск в исходном классе. В противном случае, вы можете изменить код, как:

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

Звучит разумно. – allenlinli

0

Вы также можете создать подкласс NSBundle и добавить это свойство к нему.

+0

Это нарушает намерение, что я хочу иметь метод расширения, поэтому я не предпочитаю подкласс. В любом случае, спасибо:) – allenlinli

 Смежные вопросы

  • Нет связанных вопросов^_^