0

目前正在学习objetive-c。浏览了 lynda 网站上的各种书籍和一些教程,现在找到了我认为适合我学习风格的斯坦福课程。我一直在一遍又一遍地看前 3 节课,基本上一直在做,直到我 100% 地接受所教的内容并且我离我不远了。

我很难理解以下代码在做什么以及它如何导致我的按钮切换。

sender.selected = !sender.isSelected

我更喜欢使用:

if (sender.selected) 
{
  sender.selected = NO;
} else {
  sender.selected = YES;
}

为什么?因为这对我来说很有意义,而且很明显,因为我过去在许多其他编程语言中使用过 if 语句。实际上,我可以毫无问题地完成第一个作业,并了解其中大部分内容发生了什么,但是当我删除我的代码并重新输入以练习这一部分时,我会绊倒我,我觉得我在欺骗自己前进没有真正了解发生了什么。

我做了一些谷歌搜索,发现了这篇文章:如何 sender.selected = !sender.selected 在选定状态之间切换?

当我读完的时候,感觉就像火花在我脑海里飞舞,但还不足以点燃“啊哈,我现在明白了”的火。

假设在我点击/单击我的按钮之前选择了该按钮,我理解它的状态将设置为未选择(= !sender.isSelected),但现在假设它没有被选中,我点击/单击我的按钮。它是如何设置为选中的?

我觉得有人可以用对我来说有意义的方式来解释它。我知道一旦它进入我的脑海,它就会永远留在那里。我已经在这里坐了几个小时试图想清楚。睡着了几次,并决定需要帮助。

提前致谢

4

2 回答 2

2

你缺乏舒适感可能源于人们学习编程时的一个共同挑战,从对数字的熟悉转向编程中使用的多种类型。简而言之,类型是一组以及许多关系,这些关系从集合中获取一个或多个值并在集合中产生另一个值。在现实世界中,这些集合可以是无限的——整数的数量是无限的——但在编程语言中,它们(通常)是有限的。

现在整数,也就是整数,是一个集合,其值是熟悉的数字,基本运算是加、减、乘、负等。在(Objective-)C 中有多种整数类型 - 具有不同成员数量的不同集合; 例如intunsigned long。使用这种熟悉的类型,您是否对以下内容感到满意:

int x; // declare a variable which holds a value of type int
int y; // and another one

...; // other stuff

y = -x; // place in y the negation of the value in x

你无疑会感到舒服,这只是你可能多年来一直在做的算术!在集合语言中,否定关系将 int 集合的一个成员映射到另一个成员。

现在编程语言处理的类型不仅仅是整数,但是它们的基本概念是相同的——具有基本关系集合的集合。

布尔类型是大多数编程语言的核心。这是一个只有两个成员的集合;真假;_ _ and 基本关系and , or and not . not 关系将 true 映射为 false,将 false 映射为 true。

在 Objective-C 中,布尔类型称为BOOLYES用于表示真、NO表示假,基本关系是&&(and)、||(or) 和!(not)。所以现在考虑:

BOOL x; // declare a variable which holds a value of type BOOL
BOOL y; // and another one

...; // other stuff

y = !x; // place in y the "not" of the value in x

与上述整数情况的相似之处是显而易见的——它都只是集合和关系。

基于此,应该清楚的是:

sender.selected = !sender.isSelected

优于:

if (sender.selected) 
{
   sender.selected = NO;
} 
else
{
   sender.selected = YES;
}

后者使用控制语句 ( if) 来执行实际上相当于基本算术的操作。

布尔值、整数、浮点数、字符等都只是类型,类似地对待它们——你会写出更好的代码。

HTH。

于 2013-08-25T20:52:14.843 回答
1

你当然可以使用:

 if (sender.isSelected)
   sender.selected = false;
 else
   sender.selected = true;

只是写起来更短sender.selected = !sender.isSelected,而且它让编译器更清楚你想要发生的事情。并且编译器可能会为更长的形式生成更复杂的代码,这没有任何好处。

如果您打算使用 C 或 C++,则可能值得习惯于编写这种东西的“简短形式”,因为这种“技巧”非常常用。

于 2013-08-25T18:20:32.677 回答