NSMutableDictionary路径“在展开Optional值时意外发现nil”

时间:2015-08-19 18:03:10

标签: swift nsmutabledictionary optional

我有一个简单的:

let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! String 
let dataPath = documentsPath.stringByAppendingPathComponent("Images")
let imagesPath = dataPath.stringByAppendingPathComponent(fileName)
var dictionary = NSMutableDictionary(contentsOfFile: imagesPath)!

在它到达最后一行之后,它崩溃并给了我'

  

致命错误:在解包可选值时意外发现nil

变量fileName声明为var fileName: String!

我也无法写入路径。我做错了什么?

3 个答案:

答案 0 :(得分:2)

除了gnasher729的建议之外,另一个潜在的问题是NSDictionaries及其子类的contentsOfFile初始化程序:

  

返回值

     

初始化字典 - 可能与原始接收者不同 - 在路径中包含字典,如果存在文件错误或文件内容是字典的无效表示,则为nil。

因此,如果该字典存在问题,则强行将其解包到此行

var dictionary = NSMutableDictionary(contentsOfFile: imagesPath)!

它会崩溃。

答案 1 :(得分:1)

将fileName声明为String!意味着它可能不包含String,但您确定它确实存在,并且如果您使用变量fileName并且它不包含String,则表示您接受应用程序崩溃。这似乎就是这种情况。

答案 2 :(得分:0)

正如其他人所指出的那样,问题很可能是你正在使用的一个未被包装的强制选项。 public LaunchedSurvey() { CreationTime = DateTime.UtcNow; WorkerLaunchedSurveys = new Collection<WorkerLaunchedSurvey>(); WorkerQualificationRequests = new Collection<WorkerQualificationRequest>(); _remainingDemographic = new DateTime(1900, 1, 1); MinimumPercent = 0.10; ExcludeList = new List<LaunchedSurvey>(); IncludeList = new List<LaunchedSurvey>(); ScreenedWorkers = new List<ScreenedWorker>(); EmailMessages = new List<EmailMessage>(); AssignmentsPendingWorkers = new HashSet<AssignmentsPendingWorker>(); ExcludedWorkersManual = new List<AmazonWorkerExcluded>(); IncludedWorkersManual = new List<AmazonWorkerIncluded>(); PendingWorkersQualificationsUnknown = new List<AmazonWorkerPending>(); Tags = new List<Tag>(); ManualQualificationTypeIdList = new List<QualificationType>(); WorkerSurveyStatisticAuto = new WorkerSurveyStatisticAuto(); WorkerSurveyStatisticManual = new WorkerSurveyStatisticManual(); WorkerUniqueIdentifierList = new List<WorkerUniqueIdentifier>(); } 有时被称为!是有原因的。他们有爆炸的倾向:)一次解开一个东西并使用一些Bang!语句将帮助你找出问题所在:

print