Ответ 1
Еще один ответ предложил (до его изменения):
(self.status!, self.message!) = self.parseResponse(resultBody)
Я обнаружил, что это небезопасно. Он будет сбой, если во время назначения или self.status
или self.message
будет nil
. Попробуйте этот тест на игровой площадке:
class Test {
var status: Int?
var error: String?
func parseResponse() -> (Status:Int, Error:String)
{
return (200, "Success")
}
func testIt() {
(self.status!, self.error!) = parseResponse()
print(self.status)
print(self.error)
}
}
let mytest = Test()
mytest.testIt()
Вот еще один способ:
let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (Optional(stat), Optional(err))
или, как обнаружил @AndriyGordiychuk, он работает без Optional
:
let (stat, err) = self.parseResponse(resultBody)
(self.status, self.error) = (stat, err)
Любопытно, что это работает, но назначение результата функции не выполняется.
Обратите внимание на следующий эксперимент:
var i: Int?
var s: String?
// This works
(i, s) = (3, "hello")
// This fails with error: cannot express tuple conversion '(Int, String)' to '(Int?, String?)
let t = (3, "hello")
(i, s) = t
Похоже, что когда присваивание является строковым кортежем, назначенным кортежу, Swift принимает ярлык и не строит сначала кортеж. Вместо этого просто назначается отдельный элемент.
Итак, это:
(i, s) = (3, "hello")
эквивалентно:
i = 3
s = "hello"
который работает, потому что вы можете назначить Int
переменной Int?
и переменной String
to String?
. Назначение кортежа не выполняется, поскольку типы должны соответствовать.