title: User data entry process from both UIView and UICollectionView for 1 class
body: <p>I have a project in XCODE 8 (SWIFT 3) where I try to collect user input from two screens and create an instance of a class. 
  You enter some information on the first scene and hit next button on top right which will perform a segue to a new scene where user sets another property by tapping a CollectionViewCell in a CollectionView that is also under a ViewController. After user tapped the cell and hit next on top right again (or hit back button, return to the first scene to change some properties then hit next again to continue with the entry), it will save all the properties that user defined for that instance as say “transaction1”. </p>
  
  <p>I use datasource and delegation methods to work with a CollectionView nested in a ViewController so it shouldn’t be a problem. </p>
  
  <p>The problem I am having is that I don’t know how to save an individual entry to the whole class. Maybe something like  [transaction] += [transaction1] will do but I am not sure how to implement it. After user saved a transaction entry, I will display all the transactions in relevant screens and also manipulate their properties so I need access to each property of every data entry as a “transaction” class.</p>
  
  <p>I am throughly new to whole development process so I might be asking sth easy but I tried my best to deal with it believe me. I have the relevant code to make it more understandable below. </p>
  
  <p>I thank the community for creating such a culture to share and augment ideas with a collective spirit. Its my first post so I couldn't leave that out :) But enough me, the code for class file is here: `</p>
  
  <pre><code> import UIKit
  
   import os.log
  
   class Transaction: NSObject, NSCoding {
  
  // MARK: PROPERTIES
  
  var amount: Int!
  var note: String?
  var image: UIImage?
  var currency: String
  var transactionType: transactionType!
  var transactionMedium: String
  var date: String
  var budget: String?
  
  //MARK: Archiving Paths
  
  static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
  static let ArchiveURL = DocumentsDirectory.appendingPathComponent("transactions")
  
  // MARK: TYPES
  
  struct propertyKey {
      static let amount = "amount"
      static let note = "note"
      static let image = "image"
      static let currency = "currency"
      static let transactionType = "transactionType"
      static let transactionMedium = "transactionMedium"
      static let date = "date"
      static let budget = "budget"
  }
  
  // INITIALIZATON
  
  init?(amount: Int!, note: String?, image: UIImage?, currency: String, transactionType: transactionType!, transactionMedium: String, date: String, budget: String?) {
  
  
  // TRANSACTION INITIALIZATION FAIL SCENARIO
  
      if amount == 0 {
          return nil
      }
  
  // INITIALIZE STORED PROPERTIES
  
      self.amount = amount
      self.note = note
      self.currency = currency
      self.transactionType = transactionType
      self.transactionMedium = transactionMedium
      self.date = date
      self.budget = budget
      self.image = image
  }
  
  // MARK: NSCODING
  
  func encode(with aCoder: NSCoder) {
  
      aCoder.encode(amount, forKey: propertyKey.amount)
      aCoder.encode(note, forKey: propertyKey.note)
      aCoder.encode(currency, forKey: propertyKey.currency)
      aCoder.encode(transactionType, forKey: propertyKey.transactionType)
      aCoder.encode(transactionMedium, forKey: propertyKey.transactionMedium)
      aCoder.encode(date, forKey: propertyKey.date)
      aCoder.encode(budget, forKey: propertyKey.budget)
      aCoder.encode(image, forKey: propertyKey.image)
  }
  
  required convenience init?(coder aDecoder: NSCoder) {
      // The amount is required. If we cannot decode a name string, the initializer should fail.
      guard let amount = aDecoder.decodeObject(forKey: propertyKey.amount) as? Int
  
          else {
  
              os_log("Unable to decode the amount for a Transaction object.", log: OSLog.default, type: .debug)
  
          return nil
  
          }
  
      guard let currency = aDecoder.decodeObject(forKey: propertyKey.currency) as? String
  
          else {
  
              os_log("Unable to decode the currency for a Transaction object.", log: OSLog.default, type: .debug)
  
          return nil
  
      }
  
      guard let transactionType = aDecoder.decodeObject(forKey: propertyKey.transactionType) as? transactionType!
  
          else {
  
              os_log("Unable to decode the transactionType for a Transaction object.", log: OSLog.default, type: .debug)
  
          return nil
  
      }
  
      let note = aDecoder.decodeObject(forKey: propertyKey.note)
  
      let budget = aDecoder.decodeObject(forKey: propertyKey.budget)
  
      let image = aDecoder.decodeObject(forKey: propertyKey.image)
  
      let date = aDecoder.decodeObject(forKey: propertyKey.date) as? String
  
      let transactionMedium = aDecoder.decodeObject(forKey: propertyKey.transactionMedium) as? String
  
      self.init(amount: amount, note: note as! String?, image: image as! UIImage?, currency: currency, transactionType: transactionType, transactionMedium: transactionMedium!, date: date!, budget: budget as! String?)
      }
  
      }
  
      enum transactionType {
      case income
     case expense
     }
  </code></pre>
  
  <p>`</p>