Swift 午睡配置';由闭包错误自动捕获';

Swift 午睡配置';由闭包错误自动捕获';,swift,siesta,Swift,Siesta,我正在使用Siesta框架,并试图添加decorator,以便在令牌过期时刷新令牌,但我得到了:“在初始化所有成员之前由闭包自动捕获” 原因可能是什么 service.configure("**") { $0.decorateRequests { self.refreshTokenOnAuthFailure(request: $1) // this line complains } } 更新 我发现了我的问题,想和你分享。该问题与属于类属性的服务有关: clas

我正在使用Siesta框架,并试图添加decorator,以便在令牌过期时刷新令牌,但我得到了:“在初始化所有成员之前由闭包自动捕获”

原因可能是什么

service.configure("**") {
      $0.decorateRequests {
      self.refreshTokenOnAuthFailure(request: $1) // this line complains
    }
}
更新

我发现了我的问题,想和你分享。该问题与属于类属性的服务有关:

class API: NSObject {

 private let service = Service(
    baseURL: myApiBaseUrl,
    standardTransformers: [.text, .json]
)

override init() {
    #if DEBUG
        // Bare-bones logging of which network calls Siesta makes:
        LogCategory.enabled = [.network]
    #endif

    service.configure("**") {

       $0.headers["Token"] = "Bearer \(token)"
       $0.headers["Content-Type"] = "application/json"
       $0.headers["Accept"] = "application/json"

       $0.decorateRequests {
        self.refreshTokenOnAuthFailure(request: $1)
       }
    }
}

我没有使用类属性,而是将服务移到类之外,并添加了一个指定的初始值设定项

init(myService:Service){
    super.init()

    myService.configure("**") {

        $0.headers["Token"] = "Bearer \(token)"
        $0.headers["Content-Type"] = "application/json"
        $0.headers["Accept"] = "application/json"

        $0.decorateRequests {
            self.refreshTokenOnAuthFailure(request: $1)
        }
    }

}

您可能希望在闭包的开头添加
[unowned self]
,这样就不会保留闭包。请尝试
[weak self]
同时错误消息告诉您问题所在:

在初始化所有成员之前,闭包捕获了错误:“self”

您正在尝试在初始化所有成员之前捕获
self
。考虑下面的两个例子,一个显示你所拥有的错误,另一个不显示。 您的错误示例 解决方案
谢谢你的贡献。您是否可以在OPs代码中包含这一点,以展示它是如何应用的。
service.configure(“**”{[self unowned]$0.decorateRequests{self.refreshTokenOnAuthFailure(request:$1)//这一行抱怨}
Awesome,如果您现在编辑您的答案,我很乐意在添加[self unowned]时更新它:)Kunal它正在为unowned使用未解析的标识符。我尝试了这个,它给出了与我得到的完全相同的错误:$0.decorateRequests{[unowned self]rep,req in self.refreshTokenOnAuthFailure(request:req)}
class Customer {

    var someProperty: String
    var someArray: [Int] = [1,2,3]

    init() {

        someArray.forEach {
            print("\($0): \(self.someProperty)") // Error: 'self' captured before initializing 'someProperty'
        }

        someProperty = "Potato"
    }
}

_ = Customer()
class Customer {

    var someProperty: String
    var someArray: [Int] = [1,2,3]

    init() {

        someProperty = "Potato"

        someArray.forEach {
            print("\($0): \(self.someProperty)") // Good, 'someProperty' has been initialized already
        }
    }
}

_ = Customer()


// Output:
//
// 1: Potato
// 2: Potato
// 3: Potato