检查是否在Swift与Objective-C中实例化了NSURL
我目前正在学习iOS开发课程。作为一项任务,我的任务是在一个项目上启用iCloud。我发现这有助于解释这个过程。皱纹:我已经用Swift建立了我的项目 特别是,Roadley先生内置的一个“检查”功能,用于检查是否存在iCloud实例,但它不能很好地转换为Swift。我试图测试是否有一个名为iCloud的NSURL实例被实例化;如果是,做一件事,如果不是,做另一件事 来自Roadley先生的教程:检查是否在Swift与Objective-C中实例化了NSURL,objective-c,swift,core-data,nsurl,Objective C,Swift,Core Data,Nsurl,我目前正在学习iOS开发课程。作为一项任务,我的任务是在一个项目上启用iCloud。我发现这有助于解释这个过程。皱纹:我已经用Swift建立了我的项目 特别是,Roadley先生内置的一个“检查”功能,用于检查是否存在iCloud实例,但它不能很好地转换为Swift。我试图测试是否有一个名为iCloud的NSURL实例被实例化;如果是,做一件事,如果不是,做另一件事 来自Roadley先生的教程: NSURL *iCloud = [fileManager URLForUb
NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];
if (iCloud) {
NSLog(@"iCloud is working");
// a bunch of code
} else {
NSLog(@"iCloud is working");
// a bunch of code
}
因此,我尝试将该语句转换为Swift,如下所示:
let iCloud: NSURL = fileManager.URLForUbiquityContainerIdentifier(nil)!
// TODO: having trouble "swiftifying" this line
if (iCloud) {
println("iCloud is working!")
} else {
println("iCloud is NOT working!")
}
编译器说:类型“NSURL”不符合协议“BooleanType”
我错过了什么明显的东西
编辑:
感谢你们所有人做出如此精彩、快速的回应。非常感谢他们,我在这里学到了一些东西。您可以检查它是否等于零,或者您可以使用
if let
打开它(如果它存在)fileManager.URLForUbiquityContainerIdentifier(nil)
返回一个可选的NSURL,因此您可以这样处理:
Swift 3+
if let cloudURL = fileManager.url(forUbiquityContainerIdentifier: nil) {
print("iCloud is working!")
} else {
print("iCloud is NOT working!")
}
旧版本
let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) // Remove the "!", and this should return an optional
if iCloud != nil {
println("iCloud is working!")
} else {
println("iCloud is NOT working!")
}
如果让,则使用:
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
// exists
} else {
// doesn't exist
}
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
println("iCloud is working!") // And you can access iCloud here
} else {
println("iCloud is NOT working!") // And you don't need iCloud here
}
您可以检查它是否等于零,或者使用if let
将其展开(如果存在)fileManager.URLForUbiquityContainerIdentifier(nil)
返回一个可选的NSURL,因此您可以这样处理:
Swift 3+
if let cloudURL = fileManager.url(forUbiquityContainerIdentifier: nil) {
print("iCloud is working!")
} else {
print("iCloud is NOT working!")
}
旧版本
let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) // Remove the "!", and this should return an optional
if iCloud != nil {
println("iCloud is working!")
} else {
println("iCloud is NOT working!")
}
如果让
,则使用:
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
// exists
} else {
// doesn't exist
}
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
println("iCloud is working!") // And you can access iCloud here
} else {
println("iCloud is NOT working!") // And you don't need iCloud here
}
如果fileManager.URLForUbiquityContainerIdentifier失败,这行代码将使应用程序崩溃
let iCloud: NSURL = fileManager.URLForUbiquityContainerIdentifier(nil)!
在Objective-C中,此方法返回URL或nil。在Swift中,没有nil对象。因此,该方法返回一个可选的URL。通过使用!您可以强制打开该可选URL。与Objective-C不同,您得不到有效的URL或nil,而是得到有效的URL或崩溃
因此,变量iCloud是一个NSURL*,并且它保证不为零(因为您会崩溃)。检查iCloud是否为零没有意义,因为它不可能为零
如果你删除了!然后iCloud成为可选的NSURL*。在这种情况下,可以通过检查来检查它是否有值
if (iCloud != nil)
语法
if (iCloud)
这是违法的。if语句需要一个布尔值,Swift不只是将所有内容都转换为布尔值(这在某种程度上是合法的,但后来人们发现,如果允许的话,可选布尔值是一场噩梦) 如果fileManager.URLForUbiquityContainerIdentifier失败,这行代码将使应用程序崩溃
let iCloud: NSURL = fileManager.URLForUbiquityContainerIdentifier(nil)!
在Objective-C中,此方法返回URL或nil。在Swift中,没有nil对象。因此,该方法返回一个可选的URL。通过使用!您可以强制打开该可选URL。与Objective-C不同,您得不到有效的URL或nil,而是得到有效的URL或崩溃
因此,变量iCloud是一个NSURL*,并且它保证不为零(因为您会崩溃)。检查iCloud是否为零没有意义,因为它不可能为零
如果你删除了!然后iCloud成为可选的NSURL*。在这种情况下,可以通过检查来检查它是否有值
if (iCloud != nil)
语法
if (iCloud)
这是违法的。if语句需要一个布尔值,Swift不只是将所有内容都转换为布尔值(这在某种程度上是合法的,但后来人们发现,如果允许的话,可选布尔值是一场噩梦) 在大多数情况下,最好的工具是if let
:
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
// exists
} else {
// doesn't exist
}
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
println("iCloud is working!") // And you can access iCloud here
} else {
println("iCloud is NOT working!") // And you don't need iCloud here
}
当然,如果它们很长,您应该将它们移动到自己的函数中,让“can access”函数使用完整的NSURL
,而不是可选的。这样,您就不会在if
中嵌套大量代码。但除此之外,if let
是解决此类问题的常规工具。在大多数情况下,最好的工具是if let
:
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
// exists
} else {
// doesn't exist
}
if let iCloud = fileManager.URLForUbiquityContainerIdentifier(nil) {
println("iCloud is working!") // And you can access iCloud here
} else {
println("iCloud is NOT working!") // And you don't need iCloud here
}
当然,如果它们很长,您应该将它们移动到自己的函数中,让“can access”函数使用完整的NSURL
,而不是可选的。这样,您就不会在if
中嵌套大量代码。但除此之外,if let
是解决此类问题的常规工具。if(iCloud)
-在Swift中,对于NSURL(不能神奇地转换为布尔值)来说,这应该如何工作?[它在Objective-C中工作,因为if
处理包括指针在内的整数类型,但这不是Swift。.使用显式比较。]if iCloud!=nil
检查exists@user2864740这是我的问题。我识别了Obj-C中顶部引用的代码,没有编译器错误。我如何检查iCloud
是否在Swift中实例化。因此有一个问题:“如何检查Swift中的变量是否为nil?”(一旦提取到这一点,在一些帮助下,应该很容易找到答案-注意这在技术上与Objective-C代码相同:)是的,我现在发布了一个答案。当我评论if(iCloud)
时,我没有看到显式展开的NSURL——在Swift中,对于NSURL(它不能神奇地转换为布尔值)来说,它应该如何工作?[它在Objective-C中工作,因为if
处理包括指针在内的整数类型,但这不是Swift。.使用显式比较。]if iCloud!=nil
检查exists@user2864740这是我的问题。我识别了Obj-C中顶部引用的代码,没有编译器错误。我如何检查iCloud
是否在Swift中实例化。因此有一个问题:“如何检查Swift中的变量是否为零?”(一旦提取到这个值,在一些帮助下,应该很容易找到答案-注意,从技术上讲,Objective-C代码也是一样的