我是一名网页设计师/开发人员,最终决定尝试使用 Objective-C。我坚信标准并遵守一种语言规定的任何指导方针、格式或不成文的规则,而不是试图硬塞我自己的想法应该如何完成或使用我自己的方法(双关语不是有意的,但我会随它去吧)。换句话说,我愿意用camelCaseVarNames
or编写代码underscore_var_names
;我只是想知道用所说的语言做事的“普遍接受”的方式是什么。
无论如何,我想知道编写 Objective-C 方法的正确方法——尤其是在扩展现有类时。请注意,我正在采取婴儿步骤,所以我现在不用担心 MVC 设计模式或任何“关注点分离”。我正在使用默认AppDelegate
实现文件(是的,我是个坏蛋)。<head>
我喜欢认为这相当于在学习 CSS 时在 HTML 文件中编写一堆样式;我只是想看看这个按钮的作用和那个按钮的作用。说得通?
好的,这是一个场景。假设您想编写一个简单的方法来检查视图是否属于某个类。我敢肯定有很多方法可以做到这一点(也许每个NSObject
人都有这种能力而不需要这样的功能),但请幽默。这是我想出的(请随意笑):
- (BOOL)viewInstance:(id)view isOfClass(NSString *)className
{
return ( [view class] == NSClassFromString(className) );
}
我遇到的问题是它viewInstance:
本身毫无意义,而且从我所读到的,Objective-Cer 的爱 superRichAndDescriptiveMethodNamesThatAreSelfDocumenting。话虽如此,整个方法名称包括第二部分——我假设第二部分是命名参数或参数。因此,当一起阅读时,它实际上是有一点意义的。我正在谈论的一个真实世界的例子是NSColor
'colorWithDeviceRed
方法。在我意识到这Red:
是第一个参数之前,我浏览了弹出的完成列表 20 次!完整的声明是:
+ (NSColor *)colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
我想我只是对何时和/或如何以某种方式命名函数感到困惑。此外,对象的初始化让我感到困惑。在我知道的语言中,我会创建一个这样的数组:
// JavaScript
var myArray = [ 1, 2, 3 ];
// PHP
$my_array = array( 1, 2, 3 );
// AppleScript
set myArray to { 1, 2, 3 }
// ActionScript
var myArray:Array = new Array( 1, 2, 3 );
// Python
my_array = [ 1, 2, 3 ]
// P.S. I add spaces between brackets because I'm a special boy, so no judgments.
在 Objective-C 中,我不知道该使用哪个:
NSArray *myArray = [NSArray new];
NSArray *myArray = [NSArray array];
NSArray *myArray = [[NSArray alloc] init];
NSArray *myArray = [[NSArray alloc] initWithArray:@[1,2,3]];
NSArray *myArray = [NSArray arrayWithArray:@[1,2,3]];
NSArray *myArray = @[1,2,3];
数组文字对我来说最不可怕,因为它最有意义来自其他语言。我真正不明白的是,在上面的陈述中,有一个initWithArray
方法和一个arrayWithArray
方法。唔。它是否调用相同的底层方法?
真正让我困惑的是:
[[NSDictionary alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]
查看 NSDictionary 的头文件后,它看起来是两个独立的方法。我习惯于看到可选参数,例如:
function initWithObject(object, copyItems) {
var obj = {};
if ( copyItems ) {
...
}
return obj;
}
在我的示例中,我将有一个可选参数,当包含该参数时会改变函数的流程。我对这两种方法的事情可能完全错了,但是从我对Objective-C的了解来看,这就是它的样子。但是,我不会因为我是一个小网络婊子而逃跑。是的,我可以让线程进入睡眠状态并编写类似的东西有点可怕NSTerminateNow
,但我认为在你们的帮助下,我实际上可以学到一两件事。所以,请教我!
我的写作有时可能有点“罗嗦”,所以感谢您阅读本文。