キー値ストアがあり、各構造体に識別子を割り当てることができるようにキーのリストが必要です。Playground でこれを実行できますが、同じコードは Xcode では機能せず、次のエラーが発生します。
「属性」は「<< エラー タイプ」に変換できません >>
このコード行で:
for i in keyStore.dictionaryRepresentation.keys { keys.append(i) }
Playground の完全なコードは次のとおりです。
let keyStore = NSUbiquitousKeyValueStore.default()
keyStore.set("Test", forKey: "test")
var keys : [String] = []
for i in keyStore.dictionaryRepresentation.keys { keys.append(i) }
keyStore.string(forKey: keys.first!)
Xcode には、Attributes Struct があります。
struct Attribute: KVSAccessor {
var identifier: String {return ""}
var regex: NSRegularExpression
init(kvsIndex: Int) {
var keys: [String] = []
for i in keyStore.dictionaryRepresentation.keys { keys.append(i) }
guard let key = keys[kvsIndex] else { return }
identifier = key
}
}
次のプロトコル:
protocol KVSAccessor {
var keyStore: NSUbiquitousKeyValueStore {get}
func sync()
var identifier: String {get set}
}
そして、これらの 2 つの拡張子:
extension KVSAccessor where Self: Any { func sync() { NSUbiquitousKeyValueStore.default().synchronize() } }
extension KVSAccessor where Self: Attribute { var keyStore: NSUbiquitousKeyValueStore { return NSUbiquitousKeyValueStore.default() } }
繰り返しますが、Playground のバージョンは完全に機能しますが、もう一方の問題は何でしょうか?
編集 1: すべてのコードは次のとおりです。
import Foundation
import Cocoa
struct Attribute: KVSAccessor {
var identifier: String {return ""}
var regex: NSRegularExpression
init(kvsIndex: Int) {
var keys: [String] = []
for i in keyStore.dictionaryRepresentation.keys { keys.append(i) }
guard let key = keys[kvsIndex] else { return }
identifier = key
}
}
protocol KVSAccessor {
var keyStore: NSUbiquitousKeyValueStore {get}
func sync()
var identifier: String {get set}
}
extension KVSAccessor where Self: Any { func sync() { NSUbiquitousKeyValueStore.default().synchronize() } }
extension KVSAccessor where Self: Attribute { var keyStore: NSUbiquitousKeyValueStore { return NSUbiquitousKeyValueStore.default() } }