Hello World from Objective-J

在看了almost.at网站之后,我找到了Cappuccino

 Cappuccino是一个很好的框架。有让我心动的UI层。很苹果。又能免去写

我决定看看这个用Objective-J的框架。

 

 

顺手译了一篇起步(意译):

原文:http://objective-j.org/learn/tutorials/objective-j-tutorial.php

 

 

Objective-J is a new programming language based on Objective-C. It is a superset of JavaScript, which means that any valid JavaScript code is also valid Objective-J code. Anyone familiar with JavaScript and object-oriented programming concepts, classical inheritance in particular, should have no difficulty learning Objective-J. Familiarity with Objective-C will be helpful, but it is not required.

Objective-J是一种新的编程语言。它基于Objective-C。它是Javascript的超集,这意味着,任何合法的Javascript代码都是合法的Objective-J代码。熟悉Javascript和OO编程概念的人-传统的继承概念-都不会在学习Objective-J的时候有困难。
熟悉Objective-C会很有帮助,但是不要求。

Objective-J has two types of objects, native JavaScript objects and Objective-J objects. Native JS objects are exactly what they sound like, the objects native to JavaScript. Objective-J objects are a special type of native object added by Objective-J. These new objects are based on classes and classical inheritance, like C++ or Java, instead of the prototypal model.

Objective-J有两种对象-原生Javascript对象和Objective-J对象。原生JS对象,名符其实的javascript的对象。Objective-J对象是一种特殊的原生对象。这些对象基于对象结构和继承,就像C++和Java一样,而不是prototypal模式的。
最简单的一个类:
 
一个类从@implementation开始,到@end结束。
方法:
 
-代表,这个方法是实例方法。
+可能代表类方法,we'll find out.
注意方法参数:
- (void)setJobTitle:(CPString)aJobTitle company:(CPString)aCompany
类型最好是声明出来,当然也不强求。

In Objective-J, method names are split across all of the arguments to a method. These are not technically named arguments. The method above is named setJobTitle:company:. This is achieved by concatenating the first part of the method with all the subsequent labels, in order.

在OJ中,方法名是分开的。这些参数实际上说,并不是命名参数。 上面这个方法的名字是 setJobTitle:company:

 

The parameters to a method must be passed in order, and all of the parameters are required. To call such a multiple parameter method, we pass our data after each label:

参数在传入时是有顺序的,并且都是要求的(没有默认参数这一说)。调用一个多参数的方法,可能是这样的:

 

[myPerson setJobTitle:"Founder" company:"280 North"];

As you can see, each colon is followed by the input that will be mapped to that parameter name. That sequence of label, colon, input is repeated for each parameter.

你可以看到,每个冒号后面都有一个输入参数,他们会被映射到各个参数名称。

You may be wondering why it matters what the actual name of the method is. One pattern you'll find in Objective-J and Cappuccino is the idea of passing a method as an argument to another method. This is used commonly in delegation and in the event system. Since methods aren't first class objects in the same way as JavaScript, we use a special notation to refer to them, @selector. If I wanted to pass the previous method as an argument to another method, I would use the following code:

你可能想知道为什么一个方法的真实名字很重要。OJ里,回调的手法很普遍,可能会有很多这样的代码:
[fooObject setCallbackSelector:@selector(setJobTitle:company:)];
如何使用一个对象。
This block of code creates a new Person object, and sets the name:
这段代码创建了一个Person对象,设置了name:
var myPerson = [[Person alloc] init];
[myPerson setName:"John"];
blahblah.

 

<think>好的,我现在需要帮助用户解决关于在Objective-C框架中调用`helloWorld`方法的问题。用户提供的代码片段是一个Objective-C的头文件(.h),里面定义了一个`MyFramework`类,其中有一个类方法`+ (void)helloWorld;`。用户想知道能否调用这个方法。 首先,我要回忆Objective-C的基本知识。Objective-C中的类方法以加号开头,所以`+ (void)helloWorld`确实是一个类方法,可以通过类名直接调用,比如`[MyFramework helloWorld];`。不过用户的问题可能是在特定的环境下调用,比如在iOS或macOS项目中,或者跨平台如Qt项目中。 用户之前的问题是关于C++代码中调用被注释掉的`helloWorld()`函数,现在转向了Objective-C的框架。可能需要考虑用户是否在混合使用C++和Objective-C,比如在Qt项目中调用Objective-C代码,尤其是在iOS平台上。因为Qt支持iOS,通常需要使用Objective-C或Swift来编写平台特定的代码,并通过桥接在C++中调用。 接下来,我需要验证用户提供的头文件是否正确导出了`MyFramework`类及其方法。头文件中使用了`FOUNDATION_EXPORT`来定义版本号和版本字符串,这是标准的做法。`@interface MyFramework : NSObject`表明这是一个继承自NSObject的类,符合Objective-C的惯例。 用户的问题“能调用吗”需要分情况讨论。首先,必须确保该头文件被正确导入到调用方的代码中。如果是在Objective-C或Swift文件中,直接导入头文件后即可调用。如果是在C++文件中调用,可能需要使用Objective-C++(即.mm文件扩展名),并通过适当的桥接方法。 另外,需要注意框架的链接和依赖。如果`MyFramework`是一个自定义框架,项目设置中需要正确链接该框架,并且确保编译路径包含头文件的位置。否则,即使代码正确,编译时也会出现找不到头文件或链接错误的提示。 可能用户遇到的具体问题包括: 1. 头文件未正确导入,导致编译器找不到`MyFramework`类。 2. 框架未正确链接,导致链接器错误。 3. 在C++代码中未使用Objective-C++模式,导致语法错误。 4. 方法实现缺失,虽然头文件声明了方法,但.m文件中没有实现,导致运行时崩溃或链接错误。 还需要检查`MyFramework`的实现文件(.m)中是否确实实现了`helloWorld`方法。例如,在MyFramework.m中是否有如下代码: ```objective-c @implementation MyFramework + (void)helloWorld { NSLog(@"Hello World from MyFramework!"); } @end ``` 如果没有实现,调用时会出错。 如果用户是在Qt项目中,特别是在iOS平台上调用这个Objective-C方法,可能需要通过Qt的iOS扩展或使用Objective-C++桥接。例如,创建一个C++的包装函数,在.mm文件中调用Objective-C代码,然后在Qt的C++代码中调用这个包装函数。 此外,用户需要注意Qt项目中的.pro文件是否正确配置,包含必要的框架和链接库。例如,在Qt的.pro文件中可能需要添加: ```qmake LIBS += -framework MyFramework ``` 并且确保框架的路径正确。 总结回答的结构应该是: 1. 确认方法声明的正确性。 2. 调用方法的前提条件(导入头文件、链接框架等)。 3. 不同环境下的调用方式(纯Objective-C项目、混合C++项目等)。 4. 常见错误及解决方法。 5. 示例代码展示如何正确调用。 同时,用户可能遇到的问题还包括权限设置、框架的部署路径、iOS的签名问题等,但根据当前提供的信息,重点应放在代码和项目配置的正确性上。</think>--- ### 分析 您提供的代码是一个 **Objective-C 框架的头文件(`.h`)**,其中定义了类方法 `+ (void)helloWorld`。能否调用此方法取决于以下条件: --- ### 1. **是否能直接调用?** - **Objective-C 或 Swift 项目中**:可以直接调用,前提是: 1. **头文件已正确导入**(如 `#import <MyFramework/MyFramework.h>`)。 2. **框架已链接到项目**(在Xcode的 `Build Phases` > `Link Binary With Libraries` 中添加 `MyFramework.framework`)。 3. **方法已实现**(在 `.m` 文件中实现 `helloWorld` 方法)。 - **C++/Qt 项目中**:需通过 **Objective-C++ 桥接**(需将文件扩展名改为 `.mm` 并编写桥接代码)。 --- ### 2. **关键代码验证 #### (1) 头文件声明 您的头文件声明了类方法 `+ (void)helloWorld`: ```objective-c @interface MyFramework : NSObject + (void)helloWorld; // ✅ 类方法声明正确 @end ``` #### (2) 实现文件(`.m`) 需在 `.m` 文件中实现该方法: ```objective-c @implementation MyFramework + (void)helloWorld { NSLog(@"Hello from MyFramework!"); // 示例实现 } @end ``` #### (3) 调用示例 - **Objective-C 中调用**: ```objective-c #import <MyFramework/MyFramework.h> // 调用类方法 [MyFramework helloWorld]; ``` - **C++/Qt 中桥接调用**(需 `.mm` 文件): ```cpp // Bridge.mm #import <MyFramework/MyFramework.h> extern "C" { void callHelloWorld() { [MyFramework helloWorld]; // 通过C函数桥接 } } ``` 在 C++ 中调用: ```cpp extern void callHelloWorld(); // 声明桥接函数 callHelloWorld(); // 调用 ``` --- ### 3. **常见问题排查 #### 问题 1:编译错误 `Undefined symbol: _OBJC_CLASS_$_MyFramework` - **原因**:框架未正确链接或实现文件未编译。 - **解决**: 1. 检查Xcode项目设置中是否包含 `MyFramework` 的 `.m` 文件。 2. 确保 `.pro`(Qt)或 `Podfile`(CocoaPods)中正确配置框架依赖。 #### 问题 2:运行时无输出 - **原因**:方法未实现或未实际调用。 - **解决**:检查 `.m` 文件是否实现 `helloWorld`,并在调用处添加日志或断点。 --- ### 4. **完整流程示例(Xcode 项目) 1. **创建框架**: - 新建 `MyFramework.framework`,添加头文件 `MyFramework.h` 和实现文件 `MyFramework.m`。 2. **实现方法**: ```objective-c // MyFramework.m #import "MyFramework.h" @implementation MyFramework + (void)helloWorld { NSLog(@"Hello World!"); } @end ``` 3. **调用**: ```objective-c #import <MyFramework/MyFramework.h> [MyFramework helloWorld]; // 输出 "Hello World!" ``` --- ### 结论 **可以调用**,但需满足以下条件: 1. 方法在 `.m` 文件中实现。 2. 框架头文件已导入且链接到项目。 3. 在混合语言(如C++/Qt)中需通过桥接调用。 若仍有问题,请提供具体错误信息或调用场景(如iOS/Qt项目),以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值