为什么我的if语句之间存在差异?

时间:2018-01-10 15:03:19

标签: objective-c

我来自Swift背景。我正在尝试在Objective C中实现一个单独的链表来进行练习......

这是我的代码:

#import <Foundation/Foundation.h>
#import "LinkedList.h"

@implementation LikedList
Node *head;
- (void)insert:(NSString *)value{
    if (head == nil){
        NSLog(@"*** Inserted value at head!");
        Node *node = [[Node alloc] init: value];
        head = node;
    } else {
        Node *currentNode;
        currentNode = head;

        while (currentNode.next != nil) {
            currentNode = currentNode.next;
        }

        Node *newNode = [[Node alloc] init: value];
        currentNode.next = newNode;
    }

    [self printLinkedListElements];
}

-(void) printLinkedListElements{
    Node *currentNode = head;
    int iterator  = 0;
    while (currentNode != nil){
        iterator = iterator + 1;
        NSLog(@"The iteration number is: %d", iterator);
        NSLog(@"%@\n", currentNode.value);
        currentNode = currentNode.next;
    }

    NSLog(@"***********************************");
}

@end

在我的insert方法中,我首先检查头部是否为空。当我输入self.head == nilhead == nil

时,我得到两个不同的结果

当我输入self.head == nil时,我会收到以下日志:

***在头部插入值!

迭代次数为:1

ValueOne

***在头部插入值!

迭代次数为:1

ValueTwo

***在头部插入值!

迭代次数为:1

ValueThree

***在头部插入值!

迭代次数为:1

ValueFour

***在头部插入值!

迭代次数为:1

ValueFive

但是,当我输入head == nil时,我会得到我想要的结果:

***在头部插入值!

迭代次数为:1

ValueOne

***迭代次数为:1

ValueOne

***迭代编号为:2

ValueTwo

***迭代次数为:1

ValueOne

***迭代编号为:2

ValueTwo

***迭代次数为:3

ValueThree

***迭代次数为:1

ValueOne

***迭代编号为:2

ValueTwo

***迭代次数为:3

ValueThree

***迭代次数为:4

ValueFour

***迭代次数为:1

ValueOne

***迭代编号为:2

ValueTwo

***迭代次数为:3

ValueThree

***迭代次数为:4

ValueFour

***迭代次数为:5

ValueFive

在使用self.head == nil而不是head == nil时,能帮助我理解为什么我得到两个不同的输出?

1 个答案:

答案 0 :(得分:1)

这里的问题是你已经声明了一个名为head的全局变量:

@implementation LikedList
Node *head;  // <-- THIS IS A GLOBAL VARIABLE

当您说head == nil时,您指的是全局变量。当您说self.head时,您指的是实例属性(您没有显示声明)。您永远不会分配给实例属性,因此查看其值始终返回nil。

据推测,您希望支持LikedList的多个实例,因此您应该删除全局变量,并在任何地方使用self.head,如下所示:

@implementation LikedList

- (void)insert:(NSString *)value{
    if (self.head == nil){
        NSLog(@"*** Inserted value at head!");
        Node *node = [[Node alloc] init: value];
        self.head = node;
    } else {
        Node *currentNode;
        currentNode = self.head;

        while (currentNode.next != nil) {
            currentNode = currentNode.next;
        }

        Node *newNode = [[Node alloc] init: value];
        currentNode.next = newNode;
    }

    [self printLinkedListElements];
}

-(void) printLinkedListElements{
    Node *currentNode = self.head;
    int iterator  = 0;
    while (currentNode != nil){
        iterator = iterator + 1;
        NSLog(@"The iteration number is: %d", iterator);
        NSLog(@"%@\n", currentNode.value);
        currentNode = currentNode.next;
    }

    NSLog(@"***********************************");
}

@end