У меня есть структура костей.Строки Swift не сохраняются в структуре
struct Transaction {
var value: String = ""
var date: String = ""
var title: String = ""
}
В моем проекте, Transaction
используется как так ...
var transaction:Transaction = Transaction()
//loops 3 times
repeat {
let parsed = stringAndType(from:myParser)//-> (string:String, type:UInt8)
switch parsed.type {
case 1:
print("1 -- \(parsed.string")
transaction.value = parsed.string
case 2:
print("2 -- \(parsed.string)")
transaction.date = parsed.string
case 4:
print("4 -- \(parsed.string)")
transaction.title = parsed.string
default: break
}
} while myParser.isOk
print("Returning transaction: \(transaction)")
return transaction
В этом коде создается структура. Парсер передает данные коммутатору, который присваивает разборную строку соответствующей переменной Transaction
. Когда я запускаю следующий код, вывод указывает, что присвоения transaction.date
и transaction.value
не прилипают.
Выход:
2 -- 12/22/2015
1 -- -5.00
4 -- RECURRING PAYMENT BACKBLAZE
Returning transaction: Transaction(value: "", date: "", title: "RECURRING PAYMENT BACKBLAZE")
Существует комплекс буферизация за кулисами в stringAndType()
. Рассматривая это как программист на C, я действительно хочу думать, что проблема может быть проблемой. Тем не менее, у меня создалось впечатление, что строки Swift являются структурами и поэтому копируются при записи, как целое или двойное. Надеюсь, вы сможете дать представление. Спасибо за ваше время.
Update 02/15/17
Логика в этом коде работает, как ожидалось. Я думаю, что проблема здесь в управлении памятью. Чтобы управлять этой точки, я ...
- Удалены
print
линии от моего переключателя - Добавлено
didSet {}
каждой переменной вTransaction
Как так ...
struct Transaction {
var value: String = "" {
didSet {
print("The VALUE has changed from \(oldValue) to \(value)")
}
}
//this is repeated appropriately for the other two variables
}
Данный выход исключает любые логические проблемы. Выход:
The DATE has changed from to 12/22/2015
The VALUE has changed from to -5.00
The TITLE has changed from to RECURRING PAYMENT BACKBLAZE
Returning transaction: Transaction(value: "", date: "", title: "RECURRING PAYMENT BACKBLAZE")
stringAndType()
делает чтения из небезопасного буфера, но он копирует байты в Data
структуры, и возвращает строку инициализированную из скопированных данных. Я думал, что это изолирует меня от проблем с безопасностью ... возможно, что подробности реализации до String
Мне не хватает?
Я считаю, что он входит в корпус коммутатора и переходит в последний случай, когда назначается заголовок, а не «значение» и «дата». – ebby94
Почему вы думаете, что вы переключаете корпус, провалится в случае 1? Похоже, он никогда не выполняет другие случаи. – JuicyFruit
Когда я пытаюсь запустить ваш код с помощью массива со строковыми значениями, все работает нормально: Возвращаемая транзакция: Транзакция (значение: «12/22/2015», дата: «-5,00», название: «RECURRING PAYMENT BACKBLAZE») – unkgd