【发布时间】:2019-02-06 09:47:40
【问题描述】:
我正在尝试将 IAP 收据传递给包含用户的 completion handler,并希望通过在我收到的其他一些 class 中调用它来检查用户 subscription 当前是否处于活动状态。我该如何解决这个问题。
不能调用非函数类型的值'((Student) -> Void)?'
func validateReceipt(pReceiptData: Data? = nil, completion pCompletion: ((Student) -> Void)? = nil) {
let receiptData = pReceiptData!.base64EncodedString()
let receiptDict: [String: Any] = ["receipt-data": receiptData]
do {
let data = try JSONSerialization.data(withJSONObject: receiptDict)
guard let validationUrl = URL(string: "https://us-central1-myApp-a8e27.cloudfunctions.net/receiptValidation") else { return }
let session = URLSession(configuration: .default)
var request = URLRequest(url: validationUrl, cachePolicy: .reloadIgnoringLocalCacheData)
request.httpMethod = "POST"
request.httpBody = data
let task = session.uploadTask(with:request, from: data) { (data, response, error) in
guard let data = data, error == nil else { return }
do {
let receipt = try IAPReceipt.decode(data: data)
pCompletion(receipt)
} catch let error {
print(error.localizedDescription)
}
}
task.resume()
} catch let error {
print(error)
}
}
【问题讨论】:
-
不相关,但为什么
pReceiptData是可选的nil默认值,尽管无论如何它都会被强制解包。这没有任何意义。 -
@vadian 也可以将默认值设置为空闭包
{ }然后他可以避免可选参数 -
@vadian 是因为我只在当前调用的调用中需要它。我在其他地方不需要它,因此不会使用它,因此将其设为可选并将其默认为
nil -
pCompletion是可选的,所以至少应该是pCompletion?(receipt),不是吗?此外,我倾向于使闭包的Student参数成为可选参数,并且可能使用错误参数,以防出现错误以在所有情况下调用完成。
标签: ios swift closures completionhandler