2015-09-08 57 views
0

我將數組保存到模型中時,保存數據時未包含可選(...),但是當讀取數據時我得到可選(...)環繞它。感謝您的幫助和耐心,因爲我是Swift新手。在Swift中可選包裝,爲什麼Swift將「可選」添加到字符串

這是println添加值模型時:

saveOperativesInModel: Test Name 

這是println讀取值時,從模型回:

getOperativesFromModel: Optional(Test Name) 

爲什麼雨燕添加「可選(xxx)「到字符串?

這是降低代碼:

func saveOperativesInModel() { 


    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext! 
    let entity = NSEntityDescription.entityForName("Operatives", inManagedObjectContext: managedContext) 

    var item: NSManagedObject! 
    if let operativesList = self.operativesResult?.operativesList { 
     self.operativesTable.removeAll() 
     for itemInArray in operativesList { 
      item = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext) 
      item.setValue(itemInArray.firstName, forKey: "firstName") 
      var error: NSError? 
      if !managedContext.save(&error) { 
      } else { 
       self.operativesTable.append(item!) 
       println("saveOperativesInModel: \(itemInArray.firstName)") 
      } 
     } 
    } 

    let fetchRequest1: NSFetchRequest! = NSFetchRequest(entityName:"Operatives") 
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest1, error: &error) as? [NSManagedObject] 
    if let operativesTable = fetchedResults { 
     if operativesTable.count > 0 { 
      for item in operativesTable { 
       let operative: Operative! = Operative() 
       operative.firstName = String (stringInterpolationSegment: item.valueForKey("firstName")) 
       println("getOperativesFromModel: \(operative.firstName)") 
      } 
     } 
    } 
} 

回答

4

Optional出現在控制檯因爲item.valueForKey返回AnyObject?,可選類型。由於您在字符串插值段中使用了valueForKey值,因此該值成爲可選項。因此,打印到控制檯的值是可選的,並且Swift會自動在控制檯中的可選值周圍添加Optional()包裝。

爲了避免這種情況,您可以:

  • 強制拆開包裝使用!(力展開)運算符從valueForKey值,這將是這個樣子:String(stringInterpolationSegment: item.valueForKey("firstName")!),或
  • 使用if let檢查一個值,然後打印出解包的值。例如:

    if let firstName = item.valueForKey("firstName") { 
        operative.firstName = String(firstName) 
        println("getOperativesFromModel: \(operative.firstName)") 
    } 
    
+0

感謝(和刪除以往的評論:)那麼,什麼是解決方案?我應該用避免Optional()的方式來包裝它,因爲當我把這個數組放到TableView中時,我也得到Optional() –

+0

請參閱我對我的文章所作的編輯。 – aaplmath

2

這已經回答了爲什麼看到 「可選(...)」 的輸出。 以下是關於如何解決問題的一些額外想法。

你寫

operative.firstName = String (stringInterpolationSegment: item.valueForKey("firstName")) 

的原因可能是直接分配

operative.firstName = item.valueForKey("firstName") 

不會編譯:等式右邊有型AnyObject?,而 LHS是String

更好的解決方案將是一個可選的投

if let firstName = item.valueForKey("firstName") as? String { 
    operative.firstName = firstName 
} else { 
    // There is no first name, or it is not a String. 
} 

或者使用未繳合併運算??提供一個默認值:

operative.firstName = item.valueForKey("firstName") as? String ?? "default name" 

但是我真的做的是讓Xcode爲核心數據實體創建NSManaged對象 子類文件(也許你甚至已經做了 ?)。然後,你不需要鍵 - 值編碼方法了 ,可以直接訪問實體屬性:

let fetchRequest1: NSFetchRequest! = NSFetchRequest(entityName:"Operatives") 
let fetchedResults = managedContext.executeFetchRequest(fetchRequest1, error: &error) as? [Operatives] 
if let operativesTable = fetchedResults { 
    for item in operativesTable { 
     let operative = Operative() 
     operative.firstName = item.firstName 
     println("getOperativesFromModel: \(operative.firstName)") 
    } 
} 
相關問題