2016-08-19 15 views
0

私が作成した新しい構造体を保存しようとしているときにCoreDataに保存できません。 Swift: '[String:DayData]'タイプの値を期待される引数型 'AnyObject?'に変換できません。

var allInfoByDateDefault = NSUserDefaults.standardUserDefaults() 
    allInfoByDateDefault.setValue(allInformationByDate, forKey:"allInfoByDateRecord") 
    allInfoByDateDefault.synchronize() 

は、誰もがこの構文を修正する方法を知っている...特に "allInformationByDate" に、このコードの塊に

Cannot convert value of type '[String : DayData]' to expected argument type 'AnyObject?'

var allInformationByDate = [ 
"2016-08-13": DayData(sales: 0, doorsKnocked: 0, milesWalked: 0.00, hoursWorked: 0.00) 

] 

struct DayData { 
let sales: Int 
let doorsKnocked: Int 
let milesWalked: Double 
let hoursWorked: Double 
} 

は、私はエラーを取得しています?私は

allInformationByDate as! AnyObject 

に変更しようとしましたが、アプリがクラッシュするだけです。

+0

それを読んだあなたは、クラスNSCodingに準拠代わりに構造体を使用してにNSKeyedArchiverを使用する必要がありますオブジェクトをNSDataに変換してNSUserDefaultsまたはplistファイルに保存します –

+0

上記に加えて、 'setValue:forKey:'の代わりに 'setObject:forKey:'を呼び出す必要があります。 (AnyObjectは「すべてのクラスが暗黙に準拠しているプロトコル」 - 構造体などの値型はクラスではありません) – titaniumdecoy

+0

@LeoDabus私はちょうど言った言葉を理解しません。しかし、それは合法的だと思われる... – adman

答えて

1

問題は、NSUserDefaults

でカスタムオブジェクトを保存することはできません。しかしDayDataのすべてのプロパティは、対応のプロパティリストされているので、あなたは辞書とその逆にDayDataを変換するNSUserDefaultsの拡張を書くことができるということです。

この拡張子は、DayDataオブジェクトと辞書[String:DayData]という1つのオブジェクトを書き込むことができます。

extension NSUserDefaults { 

// read a write a single 'DayData' object 

    func dayDataForKey(key: String) -> DayData? { 
    guard let data = self.objectForKey(key) as? [String:AnyObject] else { return nil } 
    return DayData(sales: data["sales"] as! Int, doorsKnocked: data["doorsKnocked"] as! Int, milesWalked: data["milesWalked"] as! Double, hoursWorked: data["hoursWorked"] as! Double) 
    } 

    func setDayData(dayData : DayData, forKey key: String) { 
    let propertyListRepresentation = ["sales": dayData.sales, "doorsKnocked" : dayData.doorsKnocked, "milesWalked": dayData.milesWalked, "hoursWorked": dayData.hoursWorked] 
    self.setObject(propertyListRepresentation, forKey: key) 
    } 

    // read a write a dictionary ('[String:DayData]') object 

    func dayDataDictionaryForKey(key: String) -> [String: DayData]? { 
    guard let dayData = self.objectForKey(key) as? [String : [String: AnyObject]] else { return nil } 
    var result = [String: DayData]() 
    for (key, value) in dayData { 
     result[key] = DayData(sales: value["sales"] as! Int, doorsKnocked: value["doorsKnocked"] as! Int, milesWalked: value["milesWalked"] as! Double, hoursWorked: value["hoursWorked"] as! Double) 
    } 
    return result 
    } 

    func setDayDataDictionary(dayData : [String: DayData], forKey key: String) { 
    var result = [String : [String: AnyObject]]() 
    for (key, value) in dayData { 
     result[key] = ["sales": value.sales, "doorsKnocked" : value.doorsKnocked, "milesWalked": value.milesWalked, "hoursWorked": value.hoursWorked] 
    } 
    self.setObject(result, forKey: key) 
    } 
} 

今、あなたは簡単にユーザーのデフォルトに辞書を書き込むことができます。

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setDayDataDictionary(allInformationByDate, forKey: "allInfoByDateRecord") 

または

let defaults = NSUserDefaults.standardUserDefaults() 
if let infoByDateDefault = defaults.dayDataDictionaryForKey("allInfoByDateRecord") { 
    allInformationByDate = infoByDateDefault 
} 
+0

私はそれがスウィフトになるとまだnoobです。これらの要素はどこに置くべきですか?ありがとう! – adman

+0

拡張子をファイルの最上位に置きます(**はクラスまたは構造体ではありません)。それからどこからでもアクセスできます。 – vadian

+0

元の行を "NSUserDefaults.stand ..."に置き換えると、 "型の値 '[String:DayData]を' DayData 'の予想される引数型に変換できません。助言がありますか? – adman

0

setValueメソッドを使用しないでください。辞書を設定するには、setObjectメソッドを呼び出します。

ドキュメント:

Sets the value of the specified default key in the standard application domain.

The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects...

また、それはだ非常にのObjective-C APIとスウィフトの構造体を使用するのは不便。構造体をNSCodingに準拠させ、それをNSUserDefaultsに格納する前にNSDataに変換する必要があります。それは基本的に混乱の全体の多くです。

NSCodingに準拠する方法を示すチュートリアルを検索できますが、実際に使用することはお勧めしません。

NSUserDefaultsは、通常、整数、浮動小数点数、boolなどの単純なデータ構造を保存するために使用されます。これは結局のところ、ユーザーの好みや関連するものを保存するように設計されているからです。

あなたはこのような構造体を持っているので、NSUserDefaultsの代わりにコアデータを使用することをお勧めします。あなたは、データモデルを作成し、構造体に基づいてNSManagedObjectサブクラスを生成することができます。

class DayData: NSManagedObject { 
    @NSManaged var sales: NSNumber? 
    @NSManaged var doorsKnocked: NSNumber? 
    @NSManaged var milesWalked: NSNumber? 
    @NSManaged var hoursWorked: NSNumber? 
} 

私を信頼し、コアデータは、状況のこれらの種類にはるかに便利です。

詳細はthis tutorialをご覧ください。

関連する問題