2016-06-02 2 views
0

я установить некоторые переменные в качестве объектаКак получить доступ к элементам из NSObject в swift?

import UIKit 
class SpeedTestResult: NSObject { 
    var testTime: NSDate? 
} 

Тогда в контроллере я создал этот объект и передать его в класс, чтобы сохранить его:

testResult.testTime = NSDate() 
SpeedTestManager().addTestResult(testResult) 

Мне нужно хранить этот объект и то доступ к элементам внутри в целях более поздних версий, это то, что у меня есть:

import Foundation 
class SpeedTestManager : NSObject { 
    var testResultArray = [NSObject]() 
    func addTestResult(testResult: NSObject) { 
     testResultArray.append(testResult) 
     print("Printing testResultArray: \(testResultArray)") 

    } 
} 

Но когда я пытаюсь напечатать объект я просто получить

Printing testResultArray: [<ProjectName.SpeedTestResult: 0x127b85e50>] 

Как получить доступ к элементам внутри объекта и сохранить этот объект и получить его для последующего использования в представлении?

ответ

2
class TestResult : NSObject, NSSecureCoding { 
    var testTime: NSDate? 

    override init() { 
     super.init() 
    } 

    @objc required init?(coder decoder: NSCoder) { 
     self.testTime = decoder.decodeObjectForKey("testTime") as? NSDate 
    } 

    @objc func encodeWithCoder(encoder: NSCoder) { 
     encoder.encodeObject(self.testTime, forKey: "testTime") 
    } 

    @objc static func supportsSecureCoding() -> Bool { 
     return true 
    } 

    override var description: String { 
     return String.init(format: "TestResult: %@", self.testTime ?? "null") 
    } 
} 

class SpeedTestManager : NSObject, NSSecureCoding { 
    var testResultArray = [NSObject]() 

    func addTestResult(testResult: NSObject) { 
     testResultArray.append(testResult) 
     print("Printing testResultArray: \(testResultArray)") 
    } 

    override init() { 
     super.init() 
    } 

    @objc func encodeWithCoder(encoder: NSCoder) { 
     encoder.encodeObject(self.testResultArray, forKey: "testResultArray") 
    } 

    @objc required init?(coder decoder: NSCoder) { 
     self.testResultArray = decoder.decodeObjectForKey("testResultArray") as! [NSObject] 
    } 

    @objc static func supportsSecureCoding() -> Bool { 
     return true 
    } 

    override var description: String { 
     return String.init(format: "SpeedManager: [%@]", self.testResultArray.map({"\($0)"}).joinWithSeparator(",")) 
    } 
} 

class TestViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     let testResult = TestResult() 
      testResult.testTime = NSDate() 

     let speedManager = SpeedTestManager() 
      speedManager.addTestResult(testResult) 

     NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(speedManager), forKey: "speedManager") 
     NSUserDefaults.standardUserDefaults().synchronize() 

     if let archivedSpeedManager = NSUserDefaults.standardUserDefaults().objectForKey("speedManager") as? NSData { 
      let unarchivedSpeedManager = NSKeyedUnarchiver.unarchiveObjectWithData(archivedSpeedManager) 
      print("SpeedManager: \(unarchivedSpeedManager ?? "null")") 
     } 
     else { 
      print("Failed to unarchive speed manager") 
     } 
    } 
} 
0

Вот один из способов вы можете сделать это:

import Foundation 

    class SpeedTestResult: NSObject { 
     var testTime: NSDate? 
    } 

    class SpeedTestManager : NSObject { 
     var testResultArray = [NSObject]() 
     func addTestResult(testResult: NSObject) { 
      testResultArray.append(testResult) 
      for result in testResultArray { 
// This will crash if result is not a SpeedTestResult. 
//    print((result as! SpeedTestResult).testTime) 
// This is better: 
       if let timeResult = result as? SpeedTestResult 
       { 
        print(timeResult.testTime) 
       } 
       else 
       { 
        print("Not time type...") 
       } 
      }   
     } 
    } 

    var testResult = SpeedTestResult() 
    testResult.testTime = NSDate() 
    SpeedTestManager().addTestResult(testResult) 

Это решает ваш конкретный вопрос, но есть некоторые другие проблемы здесь:

  • Если вы собираетесь хранить только SpeedTestResult экземпляры в testResultArray, то почему бы не сделать его типа [SpeedTestResutl]()?
  • Если вы будете хранить различные типы тестов в массиве, то как вы узнаете, какой тип теста представляет элемент NSObject? Есть способы ... В приведенном выше коде мы по крайней мере убеждаемся, что мы не рассматриваем неправильный тип объекта как SpeedTestResult.
  • Когда вы делаете SpeedTestManager().addTestResult(testResult), вы не держите ссылку на экземпляр SpeedTestManager. В следующий раз вы сделаете один и тот же звонок, вы будете создавать другой экземпляр .

  • Это не проблема, но SpeedTestManager не должен быть суб-класс от NSObject, если вы не хотите использовать его в Objective-C.

  • Возможно, вы не хотите печатать содержимое testResultArray в addTestResult() метод. У вас могут быть другие методы для доступа к массиву для .

Чтобы добавить результаты теста на тот же менеджер тест, вы можете сделать:

let myTestManager = SpeedTestManager() 
myTestManager.addTestResult(testResult)  
// create other test results and add them ... 
Смежные вопросы