gpt4 book ai didi

ios - 从 .plist 中检索的 Objective-C 样式在 Swift 中不起作用?

转载 作者:行者123 更新时间:2023-11-28 09:57:50 27 4
gpt4 key购买 nike

每当我的 View 通过以下方法加载时,我都在 Objective-C 的 .plist 中检索数据 -

@interface ListTableViewController ()

@end

@implementation ListTableViewController
NSArray *dict;

-(void)viewDidAppear:(BOOL)animated
{
NSString *arr= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

arr=[arr stringByAppendingPathComponent:@"datalist.plist"];
if ([[NSFileManager defaultManager]fileExistsAtPath:arr])
{
dict=[NSArray arrayWithContentsOfFile:arr];
NSLog(@"%@",dict);

}
[self.tableView reloadData];

}

现在对于 Swift 我正在做同样的事情 -

class ListTableViewController: UITableViewController{
var arr = NSArray()
var plistfinalpath = String()

override func viewDidAppear(animated: Bool){
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]
plistfinalpath = path.stringByAppendingString("/login.plist")
print(plistfinalpath)
print("time of appearing\(arr)")

arr = NSArray(contentsOfFile: plistfinalpath)!
self.tableView.reloadData()
}
}

但由于我必须解开 arr = NSArray(contentsOfFile: plistfinalpath)! 行中的值,当应用程序首次启动时 plist 为空时,数组为空,因为我正在打开它,它显示错误。那么我怎样才能实现我在 Objective-C 中所做的事情呢?

最佳答案

完整的答案涉及理解“可选”的概念。

什么是可选的?

在 Swift 中,您可以在类型后附加 ? 将变量声明为可选。当您这样做时,这意味着该变量可以保存一个值或根本不保存。当您将变量声明为非可选变量时,编译器会确保它始终保存一个值。

  • 将变量声明为可选:var myOptionalVariable: NSArray?
  • 声明一个变量不是可选的:var myVariable = NSArray()

注意在非可选变量中,编译器强制我们给它一个值(在本例中只是一个空数组)。这是因为编译器允许当一个变量不是可选的时,它在每时每刻都有一个值。 注意区别:第一条语句只是声明变量为可选NSArray,第二条语句初始化和赋值一个新的空 NSArray 到变量。

为什么 optional 有用?

随着可选值的引入,我们对变量中包含的数据的存在性有了编译时安全性。当不使用可选变量时,我们肯定知道变量始终保持一个值。同时,当使用可选变量时,我们不得不处理值可能不存在的情况,而不是默默地处理它(这就是目标中 nil 发生的情况-C)。从可选中提取值称为展开

展开可选(即从可选中提取值)

要从可选变量中“提取”值,您需要将其解包。有几种方法可以解包一个可选的,给定 myOptional 是一个可选变量,这里有一些例子:

if let variable = myOptional { 
// I can safely use variable here
}

甚至这个其他语法:

variable = myOptional ?? defaultNonOptionalValue
// I can safely use variable here

此外,您可以使用

进行强制解包
variable = myOptional!
// crash incoming?

您使用这种方式进行解包,但实际上您是在对编译器说“相信我,我知道 myOptional 永远不会为 nil”你的情况不是真的,它会导致崩溃并出现错误 Fatal error: unwrappedly found nil while unwrapping an Optional values。您应该始终避免强制解包,除非您真的非常确定您的数据。

长话短说

您有 2 个可行的解决方案:

  • 不要使用强制解包(参见上面关于解包的选项)
  • 将您的变量 arr 转换为可选变量(通过以这种方式声明它:var arr: NSArray?)然后处理(非强制)解包你使用它(即在你的 tableView 数据源方法中)

哪个更适合你的情况,取决于 arr 的意思,如果可选的有意义,那就去做吧,否则,就让它不可选并分配一些默认值.

关于ios - 从 .plist 中检索的 Objective-C 样式在 Swift 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com