检查是否在Swift与Objective-C中实例化了NSURL

检查是否在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

我目前正在学习iOS开发课程。作为一项任务,我的任务是在一个项目上启用iCloud。我发现这有助于解释这个过程。皱纹:我已经用Swift建立了我的项目

特别是,Roadley先生内置的一个“检查”功能,用于检查是否存在iCloud实例,但它不能很好地转换为Swift。我试图测试是否有一个名为iCloud的NSURL实例被实例化;如果是,做一件事,如果不是,做另一件事

来自Roadley先生的教程:

            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代码也是一样的