Ios 如何在类扩展中添加静态(存储)属性以生成单例?(Swift)

Ios 如何在类扩展中添加静态(存储)属性以生成单例?(Swift),ios,objective-c,swift,extension-methods,Ios,Objective C,Swift,Extension Methods,我想把这个代码转换成Swift。这里的Objective-C代码正在生成一个单例对象(如果我可以这样描述的话)。我可以使用dispatch\u once\u t来转换它,但我想使用一种更优雅的方式,它应该类似于“static let bundle:NSBundle!”。但是扩展中不允许使用“static let bundle:NSBundle!”,因为它不允许存储属性 那么,是否可以在不发送一次的情况下转换代码 我面临一个问题,我不能在类扩展中存储属性 @实施NSBundle(CTFeedbac

我想把这个代码转换成Swift。这里的Objective-C代码正在生成一个单例对象(如果我可以这样描述的话)。我可以使用dispatch\u once\u t来转换它,但我想使用一种更优雅的方式,它应该类似于“static let bundle:NSBundle!”。但是扩展中不允许使用“static let bundle:NSBundle!”,因为它不允许存储属性

那么,是否可以在不发送一次的情况下转换代码

我面临一个问题,我不能在类扩展中存储属性

@实施NSBundle(CTFeedback)

我的Swift代码:

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

您可以始终让静态变量驻留在扩展之外,或者在一个单独的类中,或者作为一个简单的全局变量(静态变量是什么)

例如:

 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;
     }
 }

在Swift中,不能在扩展中添加静态变量。 如果可以访问,您可以在原始类中重试。否则,您可以修改代码,如下所示:

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

您还可以将NSBundle子类化并将此属性添加到其中

错误是什么,可以尝试使用
self
这是什么样的单例模式?您总是重新分配
FeedbackBundle.bundle
。如果我将“FeedbackBundle”中的“bundle”设置为单例,那么FeedbackBundle也可以是单例。我尝试从“static let bundle:NSBundle!=…”开始。听起来很合理。它打破了我想要一个扩展方法的意图,所以我不喜欢子类。无论如何,谢谢你:)
if let bundleURL2 = bundleURL
{
    return NSBundle(URL: bundleURL2)
}
else
{
    return NSBundle.mainBundle()
}