- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经广泛阅读了已经发布的问题,但无法完全找到我正在寻找的答案。
我完全理解使用 @syntesize
指令创建 getter 和 setter 方法的概念(即如果我有 @property int width
和 @synthesize width
,我无意中创建了 width
的 getter 方法和 setWidth:
的 setter 方法。
但是,当我没有使用 @synthesize
指令而是在 @implementation
部分声明实例变量是对象时,我不完全理解访问器是如何工作的方法有效。这是我对以下代码不理解的地方:
1) 在 main
中写着:
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
在我看来,它似乎会调用 [[myRect origin1] x]
方法,该方法首先确定 [myRect origin1]
返回 origin
然后会立即调用 [origin x]
作为结果(然后对 y
执行相同的操作)。现在,让我失望的是,如果我要更改 getter 方法的名称
-(XYpoint *) origin1;
包含在 Rectangle.h 中
-(XYpoint *) origin2;
程序出现大量错误并停止编译。注意:我还在引用该方法的所有地方更改了名称,包括将 main 中的前面代码更改为
NSLog(@"Origin at (%i, %i)", myRect.origin2.x, myRect.origin2.y);
但是,如果我也更改 setter 方法的名称:
-(void) setOrigin1: (XYpoint *) pt
到:
-(void) setOrigin2: (XYpoint *) pt
然后一切都像以前一样工作。在我看来,只有当我的 getter 和 setter 都在 x
setX
命名约定中命名时,它才能正常工作。我想这主要是我需要解释的:
A) 如果我创建的实例变量恰好是一个对象(如本例中的“origin”),我必须为其创建 getter 和 setter 方法吗?
B) 我可以创建一个 getter 方法而不是 setter 方法吗,反之亦然
C) 如果我确实为“origin”创建了 getter 和 setter 方法,那么它们是否必须以 x
setX
方式命名。在本例中为 -(XYpoint *) origin1
和 -(void) setOrigin1: (XYpoint *) pt
。就像我更改 getter 的名称一样,我必须相应地更改 setter 的名称吗?
这里是所有的代码:
矩形.h:
#import <Foundation/Foundation.h>
@class XYpoint;
@interface Rectangle : NSObject
@property int width, height;
-(XYpoint *) origin1;
-(void) setOrigin1: (XYpoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;
@end
矩形.m:
#import "Rectangle.h"
@implementation Rectangle
{
XYpoint *origin;
}
@synthesize width, height;
-(void) setWidth:(int) w andHeight:(int)h
{
width = w;
height = h;
}
-(void) setOrigin1: (XYpoint *) pt
{
origin = pt;
}
-(int) area
{
return width * height;
}
-(int) perimeter
{
return (width + height) * 2;
}
-(XYpoint *) origin1
{
return origin;
}
@end
XY点.h:
#import <Foundation/Foundation.h>
@interface XYpoint : NSObject
@property int x, y;
-(void) setX: (int) xVal andY: (int) yVal;
@end
XY点.m:
#import "XYpoint.h"
@implementation XYpoint
@synthesize x,y;
-(void) setX: (int) xVal andY: (int) yVal
{
x = xVal;
y = yVal;
}
@end
主要.m:
#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "XYpoint.h"
int main (int argc, const char * argv[])
{
@autoreleasepool {
Rectangle *myRect = [[Rectangle alloc] init];
XYpoint *myPoint = [[XYpoint alloc] init];
[myPoint setX: 100 andY: 200];
[myRect setWidth: 5 andHeight:8];
myRect.origin1 = myPoint;
NSLog(@"Rectangle w = %i, h = %i", myRect.width, myRect.height);
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
NSLog(@"Area = %i, Perimeter = %i", [myRect area], [myRect perimeter]);
}
return 0;
}
最佳答案
A) If I create an instance variable that happens to be an object (like 'origin' in this case) must I create getter and setter methods for it?
没有。如果您声明一个属性,则需要提供您自己的访问器或使用 @synthesize 指令来创建它们。但是您可以拥有所有您喜欢的实例变量,而无需访问它们。
B) Can I create a getter method but not a setter method or vice versa
是的,如果您将属性声明为readonly
,则可以只提供 getter。
C) Is it mandatory that if I do create both a getter and setter method for 'origin' that they both be named in the x setX manner. In this case as -(XYpoint *) origin1 and -(void) setOrigin1: (XYpoint *) pt. As in if I change the name of the getter I must change the name of the setter accordingly?
您可以为访问器提供您自己的名称,但如果您希望您的类符合所讨论属性的键值编码,则应遵循通常的约定:
@property (getter=isBar, setter=setBar) int bar;
关于objective-c - Objective-C - 访问器,即 Getters/Setters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579803/
我遵循了一本名为“Sitepoint Full Stack Javascript with MEAN”的书中的教程,我刚刚完成了第 6 章,应该已经创建了一个带有“数据库”的“服务器”。数据库只不过是
在 Jquery 中,我创建两个数组,一个嵌入另一个数组,就像这样...... arrayOne = [{name:'a',value:1}, {name:'b',value:2}] var arra
这个问题在这里已经有了答案: What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wa
我被放在别人的代码上,有一个类用作其他组件的基础。当我尝试 ng serve --aot(或 build --prod)时,我得到以下信息。 @Component({ ...,
我正在测试一些代码,并使用数据创建了一个 json 文件。 问题是我在警报中收到“[object Object],[object Object]”。没有数据。 我做错了什么? 这是代码:
我想打印 [object Object],[object Object] 以明智地 "[[{ 'x': '1', 'y': '0' }, { 'x': '2', 'y': '1' }]]"; 在 ja
我有一个功能 View ,我正在尝试以特殊格式的方式输出。但我无法让列表功能正常工作。 我得到的唯一返回是[object Object][object Object] [object Object]
在使用优秀的 Sim.js 和 Three.js 库处理 WebGL 项目时,我偶然发现了下一个问题: 一路走来,它使用了 THREE.Ray 的下一个构造函数: var ray = new THRE
我正在使用 Material UI 进行多重选择。这是我的代码。 {listStates.map(col => (
我的代码使用ajax: $("#keyword").keyup(function() { var keyword = $("#keyword").val(); if (keyword.
我遇到了下一个错误,无法理解如何解决它。 Can't resolve all parameters for AuthenticationService: ([object Object], ?, [o
我正在尝试创建一个显示动态复选框的表单,至少应选中其中一个才能继续。我还需要获取一组选中的复选框。 这是组件的代码: import { Component, OnInit } from '@angul
我正在开发 NodeJs 应用程序,它是博客应用程序。我使用了快速验证器,我尝试在 UI 端使用快速闪存消息将帖子保存在数据库中之前使用闪存消息验证数据,我成功地将数据保存在数据库中,但在提交表单后消
我知道有些人问了同样的问题并得到了解答。我已经查看了所有这些,但仍然无法解决我的问题。我有一个 jquery snipet,它将值发送到处理程序,处理程序处理来自 JS 的值并将数据作为 JSON 数
我继承了一个非常草率的项目,我的任务是解释为什么它不好。我注意到他们在整个代码中都进行了这样的比较 (IQueryable).FirstOrDefault(x => x.Facility == fac
我只是在删除数组中的对象时偶然发现了这一点。 代码如下: friends = []; friends.push( { a: 'Nexus', b: 'Muffi
这两个代码片段有什么区别: object = nil; [object release] 对比 [object release]; object = nil; 哪个是最佳实践? 最佳答案 object
我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效 Object.create(Object.prototype) Object.create(Object) Object.creat
我在不同的对象上安排不同的选择器 [self performSelector:@selector(doSmth) withObject:objectA afterDelay:1]; [self per
NSLog(@"%p", &object); 和 NSLog(@"%p", object); 有什么区别? 两者似乎都打印出一个内存地址,但我不确定哪个是对象的实际内存地址。 最佳答案 这就是我喜欢的
我是一名优秀的程序员,十分优秀!