Objective-C语法总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objective-C语法总结相关的知识,希望对你有一定的参考价值。

参考技术A

看来不精通OC还是不行的,今天开始再重新来回顾一遍OC所有的语法。
从无到有凝练一遍。
加油💪!

Objective-C 的程序分为三个部分

[ClassName Method]
可以理解为 [Receiver Message]
初始化一个类

OC的For循环跟C语言的如出一辙。

for 循环的任何位置都可以包含多个表达式 ,只要用逗号分隔这些 表达式 (不是多条语句而是多个表达式)即可。

本章内容都是与C相似

do 语句是 while 的简单转置,它把循环条件放在循环的结尾,而不是开头。

break 退出当前循环

continue 跳过当前循环中的某些语句直到当前这环循环的结尾

不添加 break 会自动贯穿

通常类的声明( @interface 部分 )要放在它自己的名为 ClassName.h 的文件中。 而类的定义( @implementation 部分 )通常放在同名的 ClassName.m 。 并在 ClassName.m 文件中使用以下语句将接口文件导入到实现文件中去 #import "ClassName.h"

1.在 @interface 中声明的时候在属性前面加上 @property
2.在 @implemetation 中实现的时候在属性前面加上 @synthesize

如果没有给变量加上存取方法的话,这个变量只能在类的内部被访问。也就是说用对象访问属性 [ObjectName propertyName] 会失败。

除了自动存取方法意外,用同名函数setProperty: value 可以定义设值方法,同名的property: 可以定义取值方方法。

定义一个类 ClassA
类有一个属性 aProperty

局部变量是基本的C数据类型,并没有默认的初始值,所以在使用前要先赋值,。局部变量初始化为nil。
方法的参数就是一种局部变量。 但是如果方法的参数是类的话,因为类是引用的,所以可以修改里面的数据。

在变量声明前加上关键字 static , 可以使局部变量多次调用保留同一个值
静态变量在程序开始时初始化一次,自动赋值为 0

不管对象在那里被创建,只要它的引用为0就会被销毁,因为在方法里面创建并返回的对象始终被引用,所以没有背销毁。而局部变量的作用域只有在方法内。所以,在方法结束后,就没有对它的引用,也就自然被销毁了。

Objective-c 代码的 Swift 3 闭包语法

【中文标题】Objective-c 代码的 Swift 3 闭包语法【英文标题】:Swift 3 closure syntax for objective-c code 【发布时间】:2016-09-23 17:40:57 【问题描述】:

我正在使用一个公开以下 Objective-c 方法的库:

- (void)signIn:(NSString *)username  password:(NSString *)password completion:(void (^)(User *user, NSError *error))completion;

我想像这样调用 swift 3 中的方法:

sign(in: "abc",  password: "def")  (user: User?, error: NSError?) -> Void in
    // ...

编译器引发以下错误:

无法将类型 '(User?, NSError?) -> Void' 的值转换为预期的参数类型 '((User?, Error?) -> Void)!'

在这个例子中我遗漏了什么?

【问题讨论】:

【参考方案1】:

当您在 Xcode 中查看库的标题时,点击“相关项目”弹出菜单(编辑器左上方的四个正方形图标)并选择“生成的界面”。这将向您展示您的 ObjC 代码的 Swift 接口是什么样的,包括该闭包参数的类型签名。

很可能类似于@escaping (user: User?, error: Error?) -> Void。但这只是我的猜测——请务必阅读生成的界面。

注意:

导入的闭包假定为@escaping。 (不过,当您创建要传递给您的函数的闭包时,您不必在使用站点上编写它。) NSError 指针通常被转换为Error 协议引用。 参数类型是作为可选还是非可选导入取决于 ObjC 文件中的可空性(或 NS_ASSUME_NONNULL)注释。

【讨论】:

感谢生成界面的提示。不幸的是,它仍然没有解决问题。这是输出:open func log(in username: String!, password: String!, completion: (@escaping (User?, Error?) -> Swift.Void)!) 【参考方案2】:

Xcode 的自动完成功能可以为您提供很多帮助。从弹出菜单中选择函数,按 Tab 以获取函数签名,再按几个 Tab 直到到达 completion 参数,然后按 Enter。这是 XCode 给我的:

instance.sign(in: String!, password: String!)  (User?, Error?) in
    // code

所以你的闭包语法应该是这样的:

instance.sign(in: String!, password: String!)  user, error in
    // code

【讨论】:

以上是关于Objective-C语法总结的主要内容,如果未能解决你的问题,请参考以下文章

《Effective Objective-C 2.0》读后总结 之四

Objective-C语法汇总

Objective-c 代码的 Swift 3 闭包语法

Objective-C 语法检查器

谈谈 Objective-C 链式语法的实现

谈谈 Objective-C 链式语法的实现