我正在尝试存储一组自定义结构。
在我下面的尝试中,我在 saveSampleArrayOfQuerySettings() 的第二行中遇到运行时错误,提示转换为 AnyObject。
struct QuerySettings {
// let ARRAY_INDEX_WHERE_TO_SAVE_STRUCT = 0
let QUERY_SETTINGS_KEY = "querysettings"
let defaults = NSUserDefaults.standardUserDefaults()
private var _includeCompletedReminders: Bool = false // Default value
var includeCompletedReminders: Bool {
get {
// If value has been set before then use it otherwise retrieve it.
return _includeCompletedReminders
} set (newVal) {
_includeCompletedReminders = newVal
// saveSettings(self, index: ARRAY_INDEX_WHERE_TO_SAVE_STRUCT, saveKey: QUERY_SETTINGS_KEY)
}
}
private var _includeRemindersWithNoDueDate: Bool = true
var includeRemindersWithNoDueDate: Bool {
get {
return _includeRemindersWithNoDueDate
} set (newVal) {
_includeRemindersWithNoDueDate = newVal
// saveSettings(self, index: ARRAY_INDEX_WHERE_TO_SAVE_STRUCT, saveKey: QUERY_SETTINGS_KEY)
}
}
}
func saveSampleArrayOfQuerySettings(saveKey: String) {
let sampleArray = [QuerySettings(), QuerySettings()]
// Persist
let archivedSettingsArray = NSKeyedArchiver.archivedDataWithRootObject(sampleArray as! AnyObject)
// RUNTIME ERROR AT PREVIOUS LINE: "Could not cast value of type 'Swift.Array<RemindersPro.QuerySettings>' (0x112df10d8) to 'Swift.AnyObject' (0x1169d6018)."
NSUserDefaults.standardUserDefaults().setObject(archivedSettingsArray, forKey: saveKey)
NSUserDefaults.standardUserDefaults().synchronize()
// For Testing Purposes - Load the saved settings
if let retrievedArchivedSettingsArray : AnyObject = NSUserDefaults.standardUserDefaults().objectForKey(saveKey) {
if let settingsArray : AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(retrievedArchivedSettingsArray as! NSData) {
let arr = settingsArray as! [QuerySettings]
print(arr.first)
}
}
}
saveSampleArrayOfQuerySettings("saveKey")
我想知道我是否需要对我的结构进行编码。我查看了这些帖子,但奇怪的是甚至无法让帖子中的示例正常工作(更不用说将它们应用到我的代码中了。)
How to save an array of objects to NSUserDefault with swift?
(Swift) Storing and retrieving Array to NSUserDefaults
How to save an array of custom structs to plist swift
你能告诉我如何让它工作吗?
最佳答案
你的代码太冗长了:
true或 false足以让编译器推断出您想要 Bool . Swift 的构建理念是编译器可以变得非常智能以减轻程序员的负担。现在,关于归档的话题:你会很沮丧地得知 NSCoding仅适用于继承自 NSObject 的对象.结构不能符合 NSCoding .您需要将它包装在一个辅助类中。
这是我想出的:
protocol ArchivableStruct {
var dataDictionary: [String: AnyObject] { get }
init(dataDictionary aDict: [String: AnyObject])
}
class StructArchiver<T: ArchivableStruct>: NSObject, NSCoding {
var structValue: T
init(structValue: T) {
self.structValue = structValue
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.structValue.dataDictionary, forKey: "dataDictionary")
}
required init?(coder aDecoder: NSCoder) {
let dataDictionary = aDecoder.decodeObjectForKey("dataDictionary") as! [String: AnyObject]
self.structValue = T(dataDictionary: dataDictionary)
}
}
字典是被归档的。在返回的路上,我们简单地解压这个 Dictionary 以获取结构。我们不需要担心 QUERY_SETTINGS_KEY和 defaults因为前者是常量,而后者有自己的数据源(NSUserDefaults)。
struct QuerySettings: ArchivableStruct {
let QUERY_SETTINGS_KEY = "querysettings"
let defaults = NSUserDefaults.standardUserDefaults()
var includeCompletedReminders = false
var includeRemindersWithNoDueDate = true
init(includeCompletedReminders: Bool, includeRemindersWithNoDueDate: Bool) {
self.includeCompletedReminders = includeCompletedReminders
self.includeRemindersWithNoDueDate = includeRemindersWithNoDueDate
}
// --------------------------------------
// ArchivableStruct protocol
// --------------------------------------
var dataDictionary: [String: AnyObject] {
get {
return [
"includeCompletedReminders": self.includeCompletedReminders,
"includeRemindersWithNoDueDate": self.includeRemindersWithNoDueDate
]
}
}
init(dataDictionary aDict: [String : AnyObject]) {
self.includeCompletedReminders = aDict["includeCompletedReminders"] as! Bool
self.includeRemindersWithNoDueDate = aDict["includeRemindersWithNoDueDate"] as! Bool
}
}
struct到辅助类因为您没有归档 QuerySetting struct 但是它们的数组,还有一个额外的步骤将它映射到 StructArchiver<T>以便您的数组可以存档:
// Set up a sample array
let a = QuerySettings(includeCompletedReminders: true, includeRemindersWithNoDueDate: false)
let b = QuerySettings(includeCompletedReminders: false, includeRemindersWithNoDueDate: true)
let sampleArray = [a, b]
// Archive
let wrapperArray = sampleArray.map { StructArchiver(structValue: $0) }
let data = NSKeyedArchiver.archivedDataWithRootObject(wrapperArray)
// Unarchive
let unwrapperArray = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [StructArchiver<QuerySettings>]
let unarchivedArray = unwrapperArray.map { $0.structValue }
关于arrays - 在 Swift 中保留一组自定义结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571985/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>