gpt4 book ai didi

swift - 在 Swift 中测试空 Objective-C 字符串的正确方法?

转载 作者:搜寻专家 更新时间:2023-11-01 07:25:44 25 4
gpt4 key购买 nike

我有一个导出以下类的 Objective-C 框架:

@interface NIDIdentifiedNumberItem : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *address;
@property (strong, nonatomic) NSString *number;
...

我读到 Objective-C 指针会自动转换为 swift 可选值,但这不是我观察到的:

enter image description here

并且以下代码不会产生预期的结果:

if item.address != nil
{
// code will execute

应该如何在 Swift 中执行 Objective-C 空指针检查?

对象因此在框架中填充:

- (NSArray*) identifiedNumbers {
NSMutableArray* numbers = [[NSMutableArray alloc] init];
NIDIdentifiedNumberItem* item = [[NIDIdentifiedNumberItem alloc] init];
item.name = "Something";
item.address = nil;
etc.
[numbers addObject:item];
return numbers;

并在 Swift 中获得:

   var identifiedNumbers = []
...
identifiedNumbers = NIDModel.singleton().identifiedNumbers()
...
let item = identifiedNumbers[indexPath.row]

我还观察到以下情况:

    let a = item.address
if a != nil {
}
if let b = item.address
{
}

这两个 if 语句都会执行。赋值后a是String类型!!而 b 是 String! 类型。为什么它们不同,为什么两个 if 语句的计算结果都为真?

最佳答案

问题是这一行:

var identifiedNumbers = []

您还没有声明这是什么数组。因此,faute de mieux,它被类型化为 NSArray。但是 NSArray 没有已知的元素类型。因此,当你说

let item = identifiedNumbers[indexPath.row]

你得到一个 AnyObject。因此,当您说 item.address 时,您并不是在获取地址;而是在获取地址。你在问这个未知的东西是否 address 属性。这就是为什么它被键入为 String!! — 第一个 ! 是因为如果这个东西确实有一个 address 它将是一个 Optional 包装一个字符串,第二个是因为具有 address 属性的整个概念将结果包装在另一个 Optional 中。

事实证明,这个未知的东西确实有一个 address 属性,所以 item.address 不是 nil。但是如果你打开 that现在你有一个可选字符串,所以现在你可以看看它是否实际上是 nil。它是:

if item.address != nil {
if item.address! != nil {
// it is nil, this won't execute
}
}

如果您正确输入了identifiedNumbers,作为[NIDIdentifiedNumberItem],您将永远不会陷入这些疯狂和不必要的困难。您可以使用 Objective-C 的轻量级泛型来帮助自动实现这一点。

关于swift - 在 Swift 中测试空 Objective-C 字符串的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com