2017-02-15 12 views
1

У меня есть структура костей.Строки 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

Логика в этом коде работает, как ожидалось. Я думаю, что проблема здесь в управлении памятью. Чтобы управлять этой точки, я ...

  1. Удалены print линии от моего переключателя
  2. Добавлено 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 Мне не хватает?

+0

Я считаю, что он входит в корпус коммутатора и переходит в последний случай, когда назначается заголовок, а не «значение» и «дата». – ebby94

+0

Почему вы думаете, что вы переключаете корпус, провалится в случае 1? Похоже, он никогда не выполняет другие случаи. – JuicyFruit

+0

Когда я пытаюсь запустить ваш код с помощью массива со строковыми значениями, все работает нормально: Возвращаемая транзакция: Транзакция (значение: «12/22/2015», дата: «-5,00», название: «RECURRING PAYMENT BACKBLAZE») – unkgd

ответ

0

Кредит @unkgd, вы были на правильном пути с вашим первоначальным ответом, прежде чем вы его убрали. Существовала логическая ошибка между циклом while parser.isOk и родительским циклом (пропущена для сокращения кода), который был очищен транзакцией между value и title. Не было никаких указаний на то, что это происходит на выходе. Цикл, вышеописанный, не трижды повторялся, а повторялся один раз, но один цикл трижды повторялся родителем. Поэтому в структуре хранилось только самое последнее проанализированное значение, в этом случае title. Опять же, полный кредит для @unkgd (если вы ответите на свой ответ, и я отметю его как правильно). Спасибо всем за их идеи.

 Смежные вопросы

  • Нет связанных вопросов^_^