Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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
Ios 在Swift中检查未初始化的非可选值?_Ios_Swift_String_Null_Optional - Fatal编程技术网

Ios 在Swift中检查未初始化的非可选值?

Ios 在Swift中检查未初始化的非可选值?,ios,swift,string,null,optional,Ios,Swift,String,Null,Optional,我有一些代码在很长一段时间内运行良好,但突然导致ar运行时崩溃。这可能是因为这是它第一次获得零值(由于一些小故障或其他原因),但无论如何,我的应用程序现在在发布时崩溃了 代码是: @objc func download(surl: NSString, completion : @escaping (NSData) -> Void ) { print("surl to download is:",surl)//CRASHES HERE if surl is uninit

我有一些代码在很长一段时间内运行良好,但突然导致ar运行时崩溃。这可能是因为这是它第一次获得零值(由于一些小故障或其他原因),但无论如何,我的应用程序现在在发布时崩溃了

代码是:

 @objc func download(surl: NSString, completion : @escaping (NSData) -> Void ) {
print("surl to download is:",surl)//CRASHES HERE if surl is uninitialized.
它在显示错误的线路上崩溃:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
以下是运行时发生错误的控制台的屏幕截图:

下面是调试器中的一行代码,它说它在崩溃时被“统一化”

如果surl是非可选的,是否仍要检查未初始化

我不愿意将surl更改为可选,因为这个方法在应用程序中被称为无数个位置,我担心在方法中更改它会导致其他内容中断

所以我想找出一种方法来测试surl是否未初始化,如果可能的话返回

谢谢你的建议

编辑:

我在调用上述方法的方法中尝试了not nil测试,并通过了not nil测试。但如果你想用它做点什么,它就会崩溃。此外,在崩溃后在控制台中打印它会给出:
(NSString)$R2=

以下是截图:


可能是您的Swift代码从Objective-C调用,Objective-C向Swift发送nil。这可以解释为什么只有在实际使用值的情况下,才会在链的末尾发生崩溃

请注意,Objective-C很乐意将一个nil值传递给不接受nil的Swift函数,Swift也很乐意将该nil值转发到只允许非nil的位置,只有在实际尝试使用该值时才会崩溃

从stacktrace中可以看出,这似乎是问题所在:Objective-C
-[IDModel updateCa..]
方法调用
实用程序。downloadImag…
Swift方法,该方法将调用转发到
实用程序.download(surl..
,当尝试使用该值时,崩溃发生在链中的最后一个函数上

为了将更改的影响降至最低,您可以做的是“重载”该函数,其中一个用于Objective-C world,另一个用于Swift world:

@objc(下载)func objc下载(surl:NSString?,完成:@escaping(NSData)->Void){
防护罩let surl=防护罩else{
//处理这个问题
返回
}
//转发到worker函数
下载(surl:surl,completion:completion)
}
//@nonobjc可能不需要,具体取决于类声明
//但直言不讳并不有害
@nonobjc func下载(surl:NSString,completion:@escaping(NSData)->Void){
//相同的代码,不需要更改
}
这样:

  • Objective-C代码将看到相同的功能,无需更改
  • Objective-C桥接器的快速实现可以检查零
  • Swift代码仍然可以使用现在的
    @nonobjc
    下载功能

如果您不相信我从Objective-C传递给Swift的nil值,以下是一个例子来证明:

//在头文件中,在桥接头文件中导入
@接口ObjCWorker:NSObject
+(无效)sendNilToSwift;
@结束
//在相应的.m文件中
@实现ObjCWorker
+(无效)sendNilToSwift{
NSString*shouldNotBeNil=nil;
[SwiftWorker doWorkWithNonNull:shouldNotBeNil];
}
@结束
//在Swift文件中
类SwiftWorker:NSObject{
@objc静态函数doWork(带字符串:NSString){
将工作委托给其他方法(字符串)
}
静态func delegateWorkToSomeOtherMethod(uString:NSString){
将工作委托给其他方法(字符串)
}
静态函数将工作委托给其他方法(u字符串:NSString){
打印(字符串)
}
}
现在,只需编写
ObjCWorker.sendNilToSwift()
,您将在操作中遇到完全相同的崩溃


1请注意,这目前仅适用于Objective-C参数:NSString、NSData,…,桥接Swift类型,如String、Data,当它们作为零值从Objective-C端发送时,会以空值进行初始化。

您确定您的代码会崩溃吗?为什么要首先使用NSString/NSData?在实现中
surl
不能是
nil
。编译器会抱怨(在编译时)如果是的话。这就是Swift强类型系统的好处。错误一定在其他地方。正如Leo已经提到的,如果有本地Swift对应项,请停止使用
NS…
类。@Leo Dabus,代码似乎在那里崩溃。请参见屏幕截图。使用NSString,因为这主要是一个Objective-C项目。但是,一个fe像这样的函数是用Swift@vadian.重新检查控制台,显示“未初始化”。如前所述,此代码已在生产应用程序中运行了一年多,但不知何故出现了无效值。不确定如何。可能是崩溃或其他原因。将编辑问题,以确定如何检查未初始化值。在一天结束时,我需要测试统一值,即使它们非常罕见,因为错误会阻止应用程序运行工作。但是OP首先给出这些参数Objective-C类型不是不对吗?NSString和NSData是不对的。@马特同意,当字符串工作正常(或者更好)时,使用NSString是不对的。可能OP继承了此代码库,不想过多地接触它。感谢这一出色的解释,您是对的,当从Obj-C方法调用该方法时,该方法失败。NSString和NSData的原因是Objective-C方法向其发送了一个字符串(在调用方法中使用NSString,然后使用返回的NSData。在函数中(未显示代码),它使用字符串和数据。