Я хочу, чтобы преобразовать этот код в 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()
}
}
}
Какая ошибка, возможно, попробуйте с 'self' – meda