2015-03-31 2 views
0

Я пишу быстрые коды для iphone. В моем приложении мне нужно сохранить информацию о друзьях. В настоящее время я использую plist для хранения данных. Я упомянул множество примеров чтения/записи NSMutableArray из/в plist, но когда я пытался хранить NSMutableArray, он просто не работает.Ошибка при хранении NSMutableArray в plist в swift

Ниже приведены мои коды, в результате результат «nil».

let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
let filename = path.stringByAppendingPathComponent("FriendList.plist") 

var FM = NSFileManager() 
if FM.createFileAtPath(filename, contents: nil, attributes: nil) { 
    if (arrayToBeStored?.writeToFile(filename, atomically: false) != nil) { 
     if NSFileManager().fileExistsAtPath(filename){ 
      let arrayFromPlist = NSMutableArray(contentsOfFile: filename) 

      //everything goes well except "arrayFromPlist" is just nil. 

      println(arrayFromPlist) 
     }else{ 
      println("Plist was not actually created!") 
     } 
    }else{ 
     println("Failed to store the array into plist.") 
    } 
}else{ 
    println("Failed to create file.") 
} 

У кого-нибудь есть идеи, что не так в моих кодах?

+0

Почему это не работает? Не добавляйте его в комментарии. Обновите свой вопрос вместо этой информации. – kkuilla

+0

@kkuilla У меня нет дополнительной информации для отображения, поскольку нет синтаксической ошибки. Я ожидаю, что «println (arrayFromPlist)» покажет некоторые данные в файле plist, в результате чего ничего нет. –

ответ

0

"arrayToBeStored.writeToFile" возвращает логическое значение, поэтому оно не сравнимо с "nil". версия

let arrayToBeStored = NSArray(object: ["test1", "test2"]) 
    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String 
    let filename = path.stringByAppendingPathComponent("FriendList.plist") 
    var FM = NSFileManager() 
    if FM.createFileAtPath(filename, contents: nil, attributes: nil) { 
     if arrayToBeStored.writeToFile(filename, atomically: false) { 
      if NSFileManager().fileExistsAtPath(filename){ 
       let arrayFromPlist = NSMutableArray(contentsOfFile: filename) 
       println(arrayFromPlist!) // => test1, test2 
      }else{ 
       println("Plist was not actually created!") 
      } 
     } else { 
      println("Failed to store the array into plist.") 
     } 
    }else{ 
     println("Failed to create file.") 
    } 

Xcode 6.2:

let arrayToBeStored = NSArray(object: ["test1", "test2"]) 
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 
let filename = path.stringByAppendingPathComponent("FriendList.plist") 
var FM = NSFileManager() 
if FM.createFileAtPath(filename, contents: nil, attributes: nil) { 
    if arrayToBeStored.writeToFile(filename, atomically: false) { 
     if NSFileManager().fileExistsAtPath(filename) { 
      let arrayFromPlist = NSMutableArray(contentsOfFile: filename) 
      println(arrayFromPlist![0][0]) // => test1 
     }else{ 
      println("Plist was not actually created!") 
     } 
    } else { 
     println("Failed to store the array into plist.") 
    } 
}else{ 
    println("Failed to create file.") 
} 

enter image description here

+0

Сначала я написал код, как вы сказали, но xcode рекомендовал исправить его таким образом. Если я настаиваю на том, как вы сказали, система просто показывает «Необязательный тип» $ T6 ?? ' connot можно использовать как логическое, вместо теста «! = nil» « –

+0

Я использовал Xcode 6.3 + Swift 1.2, и есть несколько отличий. Я добавил версию для Xcode 6.2 и Swift 1.1 в свой ответ. – Moritz

+0

Извините, но я не вижу различий в кодах ... можете ли вы объяснить больше? кроме того, возвращаемое значение writeToFile() влияет только на выход функции «if», и процесс сохранения не должен затрагиваться, не так ли? –