【问题标题】:objective-c dot notation with square brackets带方括号的objective-c点表示法
【发布时间】:2014-07-21 22:07:20
【问题描述】:

你好,我当然不懂 CS193p 这段代码

[[PlayingCard rankStrings][self.rank] stringByAppendingString:self.suit];

其中 rankString 是可变方法

 + (NSArray *)rankStrings
{
    return @[@"?", @"A", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9", @"10", @"J",      @"Q", @"K"];
}

self.rank 是一个随机数的getter

@property (nonatomic) NSUInteger rank;

和 self.suit 在另一个变量方法中

 + (NSArray *)validSuits
{
    return @[@"♥️", @"♦️", @"♠️", @"♣️"];
}

我在我的代码中插入 NSLog 以了解其功能 .... 我知道它从 rankStrings 中获取排名并将它们与西装连接起来 .... 但我不明白如何! appendingString 的方法很清楚……但是如何从 rankStrings 中获取值 rank? [PlayingCard rankStrings] 是对变量方法的简单调用,而 NSUInteger rank 是一个 getter

【问题讨论】:

  • 你是对的——这令人困惑,因为[] 有点“过载”。 [self.rank]实际上是对方法调用[PlayingCard rankStrings]返回的数组的索引操作。
  • 当然,这里的. 用于暗示对rank 的“getter”的方法调用,而不是对self 标识的结构中的字段的引用。普通 C/C++ 就是这种情况。

标签: objective-c object syntax brackets cs193p


【解决方案1】:

[PlayingCard rankString] 大概是返回一个数组。

self.rank 提供NSUInteger

我们可以使用方括号符号来访问数组索引:

myArray[10] // this accesses the object at index 10 of myArray

[PlayingCard rankString][self.rank] 正在访问由[PlayingCard rankString] 返回的数组的self.rank 索引处的对象。

该索引处的对象可能是一个可变字符串,所以我们现在对返回的对象调用一个字符串方法。

您提供的代码 sn-p 可以很容易地改写成这样:

NSArray *playingCardArray = [PlayingCard rankString];

NSMutableString *rankString = playingCardArray[self.rank];

[rankString stringByAppendingString:self.suit];

【讨论】:

  • 要真正做到正确,将索引替换为objectAtIndex,并将虚线属性引用替换为[] 引用。
【解决方案2】:

您发布的第一行代码是以下内容的简写:

[[[PlayingCard rankStrings] objectAtIndex:self.rank] stringByAppendingString:self.suit];

分解:

NSArray *array = [PlayingCar rankString];
NSString *str = array[self.rank]; // modern syntax for [array objectAtIndex:self.rank]
[str stringByAppendingString:self.suit];

当然self.rank 是实际转换为[self rank] 以调用getter 方法的属性语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    相关资源
    最近更新 更多