Я использую Swift в проекте и использую SQLite.swift для обработки базы данных. Я пытаюсь получить самую последнюю запись из моей базы данных, как показано ниже:
func returnLatestEmailAddressFromEmailsTable() -> String{
let dbPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String
let db = Database("\(dbPath)/db.sqlite3")
let emails = db["emails"]
let email = Expression<String>("email")
let time = Expression<Int>("time")
var returnEmail:String = ""
for res in emails.limit(1).order(time.desc) {
returnEmail = res[email]
println("from inside: \(returnEmail)")
}
return returnEmail
}
Я пытаюсь проверить возвращаемую строку из приведенной выше функции следующим образом:
println("from outside: \(returnLatestEmailAddressFromEmailsTable())")
Обратите внимание, как я печатаю значение как внутри, так и снаружи функции. Внутри он работает каждый раз. Я борюсь с частью «извне:».
Иногда функция возвращает правильный адрес электронной почты, а иногда возвращает "" (предположительно, значение не было задано в цикле for).
Как я могу добавить «блокирующую» функцию, чтобы вызов returnLatestEmailAddressFromEmailsTable() всегда сначала оценивал цикл for и только после этого возвращал значение?
emails.count
). Кроме того, в SQLite.swift есть вспомогательный метод для извлечения одной строки. Вы должны быть в состоянии переписать цикл for и присваивание выше с помощью одной строки:return emails.order(time.desc).first?[email]
. Однако это возвращаетString?
, поэтому используйте!
для принудительной развертки, если вы считаете, что это может привести к сбою, если строка равна нулю, или используйте?? ""
, если вы хотите вернуть пустую строку. - person stephencelis   schedule 31.01.2015