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