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语法总结的主要内容,如果未能解决你的问题,请参考以下文章