Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Swift中存储和返回数组的最佳方式是什么_Arrays_Swift_Nsuserdefaults - Fatal编程技术网

Arrays 在Swift中存储和返回数组的最佳方式是什么

Arrays 在Swift中存储和返回数组的最佳方式是什么,arrays,swift,nsuserdefaults,Arrays,Swift,Nsuserdefaults,我看了文件() Youtube上的所有视频都是关于NSUserdefaults的,我认为这是UserDefaults的旧版本,对吗 任何返回Int数组的方法,我都可以这样做: arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] ?? [Int]() arr = (UserDefaults.standard.array(forKey: "MyArray") as? [Int])! if let arr = UserDef

我看了文件()


Youtube上的所有视频都是关于
NSUserdefaults
的,我认为这是
UserDefaults
的旧版本,对吗

任何返回
Int
数组的方法,我都可以这样做:

arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] ?? [Int]()
arr = (UserDefaults.standard.array(forKey: "MyArray") as? [Int])!
if let arr = UserDefaults.standard.array(forKey: "MyArray") { 

}
或者像这样:

arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] ?? [Int]()
arr = (UserDefaults.standard.array(forKey: "MyArray") as? [Int])!
if let arr = UserDefaults.standard.array(forKey: "MyArray") { 

}
或者像这样:

arr = UserDefaults.standard.array(forKey: "MyArray") as? [Int] ?? [Int]()
arr = (UserDefaults.standard.array(forKey: "MyArray") as? [Int])!
if let arr = UserDefaults.standard.array(forKey: "MyArray") { 

}

我完全糊涂了,我不知道哪种方式是最好的方式,或者有什么区别。有人能告诉我返回
Int
String
Bool
、或
Any
对象
array
的最佳方法吗
数组(forKey:)
的内容是:

  • 它是可选的

  • 它可能是
    nil

  • 即使它不是
    nil
    ,在展开时,它也将是一个非类型化数组-一个
    [Any]

必须展开可选文件才能使用。必须将
[Any]
转换为某种特定类型的数组,例如
[Int]
,这样才有用。但是:

  • 如果展开
    nil
    ,您将崩溃

  • 如果您将事实上不是
    [Int]
    的内容向下转换为
    [Int]
    ,您将崩溃

因此,如果您认为这可能是一个
[Int]
,那么面临的挑战是安全地(不崩溃)打开可选数组,并安全地(不崩溃)将生成的数组转换为
[Int]

这是您更合理的代码片段(第一个和第三个)的目标。但是你如何“拼写”完成这项任务并没有什么区别。这一切都取决于你想如何继续,如果展开或演员不工作。在这种情况下,做任何能给你带来一致结果的事情

就个人风格而言,我可能会这么说(不是你建议的选项之一):


其优点是,它检查结果是否不是
nil
,并检查结果是否可以展开并向下转换为
[Int]
,如果答案是肯定的,则安全地执行此操作。

选项2非常糟糕。选项1和3取决于您的需要。两者都是有效的,“区别”在于它们做的事情完全不同。做你想做的事。或者别的什么。编程就是把你的愿望变成计算机语言。这不是从一堆固定选项中挑选。想想你想做什么,然后去做。“我认为这是Userdefaults的旧版本”。。。您可以将
UserDefaults
看作是
NSUserDefaults
的Swift界面。转到并在Swift和Objective-C之间切换,它只是在
UserDefaults
NSUserDefaults
之间来回跳跃。如果要执行
(UserDefaults.standard.array(forKey:“MyArray”)作为?[Int]),您也可以只执行
UserDefaults.standard.array(forKey:“MyArray”)即可![Int]
。但是,如果键
MyArray
没有任何内容,或者它不是
Int
的数组,那么这两者都会崩溃,因此您可能不会这样做。只能使用
(在强制转换或展开中)如果您知道它永远不会失败,那么最好的选择是使用第一个选项,即使用条件强制转换与nil合并运算符组合,以便在尚未设置默认值的情况下提供默认值。请注意,Swift是一种类型推断语言,因此您只需在nil合并运算符
let arr=UserDefaults.standard.array(forKey:“MyArray”)后面添加一个空数组即可?[Int]??[]
非常感谢,非常感谢。但为了确保我能区分“展开”和“无”,你认为这是正确的吗<代码>如果让myObj=UserDefaults。。。。{}
如果myObj!=nil{}
此检查是否为nil。对吗?是的,尽管你可以做得更多<代码>如果让myObj=UserDefaults。。。。作为?[Int]将一步完成所有操作:它检查结果是否为
nil
,并检查是否可以向下转换为
[Int]
,并且仅当两者的答案均为是时才继续。这不是你的选择,但我个人会这么做。我会在我的回答中加上这个。