在Objective-C中,当我有一个数组
NSArray *array;
Run Code Online (Sandbox Code Playgroud)
我想检查它是否为空,我总是这样做:
if (array.count > 0) {
NSLog(@"There are objects!");
} else {
NSLog(@"There are no objects...");
}
Run Code Online (Sandbox Code Playgroud)
这样,就没有必要检查是否array == nil因为这种情况会导致代码陷入这种else情况,以及非nil空数组也会这样做.
但是,在Swift中,我偶然发现了我有一个可选数组的情况:
var array: [Int]?
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚使用哪种条件.我有一些选择,比如:
选项A:nil在相同条件下检查非案例和空案例:
if array != nil && array!.count > 0 {
println("There are objects")
} else {
println("No objects")
}
Run Code Online (Sandbox Code Playgroud)
选项B:使用let以下方法取消绑定数组:
if let unbindArray = array {
if (unbindArray.count > 0) {
println("There are objects!")
} else {
println("There are no objects...") …Run Code Online (Sandbox Code Playgroud) 我正在学习Objective-C语言.由于我没有Mac,我正在Ubuntu 11.04平台上编译和运行我的代码.
到现在为止,我正在使用gcc进行编译.我已经安装了GNUStep,一切正常.但后来我开始尝试一些Objective-C 2.0功能,比如@property和@synthesize,这是gcc不允许的.
所以我尝试使用Clang编译代码,但似乎它没有正确地将我的代码与GNUStep库链接,甚至没有简单的Hello world程序.
例如,如果我编译以下代码:
#import <Foundation/Foundation.h>
int main(void) {
NSLog(@"Hello world!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器的输出是:
/tmp/cc-dHZIp1.o: In function `main':
test.m:(.text+0x1f): undefined reference to `NSLog'
/tmp/cc-dHZIp1.o: In function `.objc_load_function':
test.m:(.text+0x3c): undefined reference to `__objc_exec_class'
collect2: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
我用来编译的命令是
clang -I /usr/include/GNUstep/ test.m -o test
Run Code Online (Sandbox Code Playgroud)
使用-I指令包含GNUStep库(否则,Clang无法找到Foundation.h).
我搜索了我的问题,并访问了GNUStep和Clang网页,但我还没有找到解决方案.所以任何帮助将不胜感激.
谢谢!
我正在使用Handlebars.js并遇到了一个我无法解决的问题.
我想在模板中迭代一个数组,但问题是我用于迭代器的表达式是一个getter而不是一个数组.
用于说明问题的一段代码如下:
HTML:
<script id="template" type="text/x-handlebars">
Accessing directly: {{array}} <br/>
Accessing by getter: {{getArray}} <br/>
<br/>
Looping directly:
<ul>
{{#each array}}
<li>{{this}}</li>
{{/each}}
</ul>
<br/>
Looping by getter:
<ul>
{{#each getArray}}
<li>{{this}}</li>
{{/each}}
</ul>
</script>
<p id="content"></p>
Run Code Online (Sandbox Code Playgroud)
JS:
var template = Handlebars.compile($("#template").html());
var element = {
array: [0, 1, 2],
getArray: function() {
return this.array;
}
};
$("#content").html(template(element));
Run Code Online (Sandbox Code Playgroud)
问题是each使用getter的东西什么也没做.这可以在这个jsFiddle中看到.
有没有任何干净的方法来使用getter执行此操作,或者我应该编写帮助程序或类似辅助功能的东西?
谢谢!
我正在使用Ruby on Rails的Active Admin,我对面板中显示某些模型的方式存在问题.
以课堂User为例,如果我没有定义任何方法来展示友好,我明白了#<User:00000006b47868>.因此,Active Admin建议实现一种方法,为每个类指定如何显示它.
根据文档(http://activeadmin.info/docs/3-index-pages/index-as-table.html),Active Admin按以下顺序查找其中一种方法来猜测要显示的内容:
:display_name, :full_name, :name, :username, :login, :title, :email, :to_s
因此在User类中使用此方法可以解决问题:
def display_name
return self.id.to_s + '-' + self.full_name
end
Run Code Online (Sandbox Code Playgroud)
但是,在使用Active Admin之前,我已经将该方法display_name用于其他目的(例如,在视图中),以便以友好的方式显示用户名,我不想在Active Admin面板中显示相同的内容.
我无法更改方法的名称,因为我display_name在项目中使用了很多文件,并且更改它可能会在应用程序中引入错误.
这种情况的理想解决方案active_admin_name是使用Active Admin用于在其面板中显示模型的方法.所以问题是:
有没有办法让Active Admin调用一个方法而不是display_name?例如,要产生以下顺序:
:active_admin_name, :display_name, :full_name, :name, :username, :login, :title, :email, :to_s
我在Active Admin文档中搜索过config/initializers/active_admin.rb,但我找不到办法.
谢谢!