我是Swift的新手,但我是Objective-c上经验丰富的iOS开发人员。 目前,crashlytics已向单个用户报告了EXC_BREAKPOINT崩溃,但这是系统的。 我尝试了多种设备和操作系统版本,但无法复制。
行是:
if(RealmManager.sharedInstance()?.loggedUser()?.agreementPhotoRead.boolValue ?? false || PreferencesManager.getTutorialDone(forEmail: RealmManager.sharedInstance()?.loggedUser()?.email)){
}
可选链接有什么问题? Swift版本是4.2。
编辑:
geTutorialDone
方法在Objective-C中。这里的代码:
+ (BOOL)getTutorialDoneForEmail:(NSString *)email
{
return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}
答案 0 :(得分:2)
问题在于,如果stringByAppendingString
方法的输入参数NSString
为nil
(如documentation of the method中所述)实际上不起作用。
如果aString为nil,则引发NSInvalidArgumentException。
在nil
中调用该方法之前,应进行getTutorialDoneForEmail
检查,甚至更好,使getTutorialDoneForEmail
仅接受非{nil
NSString
s。 / p>
+ (BOOL)getTutorialDoneForEmail:(nonnull NSString *)email {
return [[NSUserDefaults standardUserDefaults] boolForKey:[TUTORIAL_PREF stringByAppendingString:email]];
}
此外,如果agreementPhotoRead
可以是nil
,则需要将其调用可选地链接到boolValue
,否则Swift会将其作为隐式展开的可选处理,这将导致运行时万一agreementPhotoRead
实际上是nil
时出错。
RealmManager.sharedInstance()?.loggedUser()?.agreementPhotoRead?.boolValue