小编eze*_*uli的帖子

检查可选数组是否为空

在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)

arrays ios swift

66
推荐指数
4
解决办法
6万
查看次数

使用Clang(Ubuntu)编译Objective C时出现的问题

我正在学习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网页,但我还没有找到解决方案.所以任何帮助将不胜感激.

谢谢!

compiler-construction ubuntu linker objective-c clang

10
推荐指数
2
解决办法
4566
查看次数

Handlebars.js - 每个和吸气剂

我正在使用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执行此操作,或者我应该编写帮助程序或类似辅助功能的东西?

谢谢!

getter each loops function handlebars.js

4
推荐指数
1
解决办法
2797
查看次数

Rails + Active Admin:显示名称

我正在使用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,但我找不到办法.

谢谢!

ruby web-applications ruby-on-rails activeadmin

2
推荐指数
1
解决办法
4521
查看次数