C 指针内存管理 发布时间: 2021-02-15 04:17:59 评论数: 0
C 指针在 Swift 中被冠名以 unsafe 的另一个原因是无法对其进行自动的内存管理。和 Unsafe 类的指针工作的时候,我们需要像 ARC 时代之前那样手动地来申请和释放内存,以保证程序不会出现泄露或是因为访问已释放内存而造成崩溃。我们如果想要声明,初始化,然后使用一个指针的话,完整的做法是使用 alloc 和 initialize 来创建。如果一不小心,就很容易写成下面这样:这是错误代码class MyClass { var a = 1 deinit { println("deinit") } } var pointer: ......
func 的参数修饰 发布时间: 2021-02-13 02:08:44 评论数: 0
在声明一个 Swift 的方法的时候,我们一般不去指定参数前面的修饰符,而是直接声明参数:func incrementor(variable: Int) -> Int { return variable + 1 }这个方法接受一个 Int 的输入,然后通过将这个输入加 1,返回一个新的比输入大 1 的 Int。嘛,就是一个简单的 +1器。有些同学在大学的 C 程序设计里可能学过像 ++ 这样的“自增”运算符,再加上做了不少相关的判断一个数被各种前置 ++ 和后置 ++ 折磨后的输出的考试题,所以之后写代码的时候也会比较喜欢带上这种风格。于是同样的功能可能会写出类似 ......
REFLECTION 和 MIRROR 发布时间: 2021-02-11 13:39:18 评论数: 0
熟悉 Java 的读者可能会知道反射 (Reflection)。这是一种在运行时检测、访问或者修改类型的行为的特性。一般的静态语言类型的结构和方法的调用等都需要在编译时决定,开发者能做的很多时候只是使用控制流 (比如 if 或者 switch) 来决定做出怎样的设置或是调用哪个方法。而反射特性可以让我们有机会在运行的时候通过某些条件实时地决定调用的方法,或者甚至向某个类型动态地设置甚至加入属性及方法,是一种非常灵活和强大的语言特性。Objective-C 中我们不太会经常提及到 “反射” 这样的词语,因为 Objective-C 的运行时比一般的反射还要灵活和强大。可能很多读者 ......
static 和 class 发布时间: 2021-02-09 05:43:30 评论数: 0
Swift 中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是 static 和 class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括 Objective-C 中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在 Swift 中,这两个关键字却是不能用混的。在非 class 的类型上下文中,我们统一使用 static 来描述类型作用域。这包括在 enum 和 struct 中表述类型方法和类型属性时。在这两个值类型中,我们可以在类型范围内声明并使用存储属性,计算属性和方法。static 适用的场景有这些:struct Point ......
FATALERROR 发布时间: 2021-02-06 10:40:04 评论数: 0
细心的读者可能会发现,在我们调试一些纯 Swift 类型出现类似数组越界这样的情况时,我们在控制台得到的报错信息会和传统调试 NSObject 子类时不太一样,比如在使用 NSArray 时:let array: NSArray = [1,2,3] array[100] // 输出: // *** Terminating app due to uncaught exception 'NSRangeException', // reason: '*** -[__NSArrayI objectAtIndex:]: // index 100 beyond bounds [0 ......
关于 Swift 发布时间: 2021-02-03 06:13:17 评论数: 0
Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,它的降临将重新定义软件开发。Swift 的开发从很久之前就开始了。为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构。我们使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foun ......
闭包歧义 发布时间: 2021-01-31 10:00:13 评论数: 0
Swift 的闭包写法很多,但是最正规的应该是完整地将闭包的输入和输出都写上,然后用 in 关键字隔离参数和实现。比如我们想实现一个 Int 的 extension,使其可以执行闭包若干次,并同时将次数传递到闭包中:extension Int { func times(f: Int -> ()) { print("Int") for i in 1...self { f(i) } } } 3.times { (i: Int) -> () in print(i) } // ......
性能考虑 发布时间: 2021-01-29 03:14:23 评论数: 0
在 WWDC 14 的 Keynote 上,Swift 相比于其他语言的速度优势被特别进行了强调。但是这种速度优势是有条件的,虽然由于编译器的进步我们可能可以在不了解语言特性的时候随便写也能得到性能上的改善,但是如果能够稍微理解背后的机制的话,我们就能投 “编译器所好”,写出更高效的代码。相比于 Objective-C,Swift 最大的改变就在于方法调用上的优化。在 Objective-C 中,所有的对于 NSObject 的方法调用在编译时会被转为 objc_msgSend 方法。这个方法运用 Objective-C 的运行时特性,使用派发的方式在运行时对方法进行查找。因为 ......
Selector 发布时间: 2021-01-25 22:13:53 评论数: 0
@selector 是 objc 时代的一个关键字,它可以将一个方法转换并赋值给一个 SEL 类型,它的表现很类似一个动态的函数指针。在 objc 时 selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由 selector 来负责的。在 objc 里生成一个 selector 的方法一般是这个样子的:-(void) callMe { //... } -(void) callMeWithParam:(id)obj { //... } SEL someMethod = @sele ......
基本运算符 发布时间: 2021-01-22 18:49:03 评论数: 0
本页包含内容:术语赋值运算符算术运算符组合赋值运算符(Compound Assignment Operators)比较运算符三目运算符(Ternary Conditional Operator)空合运算符区间运算符逻辑运算符运算符是检查、改变、合并值的特殊符号或短语。例如,加号+将两个数相加(如let i = 1 + 2)。复杂些的运算例如逻辑与运算符&&(如if enteredDoorCode && passedRetinaScan),或让 i 值加1的便捷自增运算符++i等。Swift 支持大部分标准 C 语言的运算符,且改进许多特性来减少常 ......
Optional Chaining 发布时间: 2021-01-19 13:54:25 评论数: 0
本页包含内容:可选链可替代强制解析为可选链定义模型类通过可选链调用属性通过可选链调用方法使用可选链调用下标脚本连接多层链接链接可选返回值的方法可选链(Optional Chaining)是一种可以请求和调用属性、方法及下标脚本的过程,它的可选性体现于请求或调用的目标当前可能为空(nil)。如果可选的目标有值,那么调用就会成功;相反,如果选择的目标为空(nil),则这种调用将返回空(nil)。多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为空(nil)将导致整个链失效。注意:Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使 ......
sizeof 和 sizeofValue 发布时间: 2021-01-17 05:45:29 评论数: 0
喜欢写 C 的读者可能会经常和 sizeof 打交道,不论是分配内存,I/O 操作,还是计算数组大小的时候基本都会用到。这个在 C 中定义的运算符可以作用于类型或者某个实际的变量,并返回其在内存中的尺寸 size_t (这是和平台无关的一个整数类型)。在 Cocoa 中,我们也有一部分 API 需要涉及到类型或者实例的内存尺寸,这时候就可以使用 sizeof 来计算。一个常见的用例是在从一个数组生成 NSData 的时候需要传入数据长度。因为在 Objective-C 中 sizeof 这个 C 运算符被保留了,因此我们可以直接这么做:char bytes[] = {1, 2, ......
基础部分 发布时间: 2021-01-16 00:40:51 评论数: 0
本页包含内容:常量和变量注释分号整数浮点数类型安全和类型推断数值型字面量数值型类型转换类型别名布尔值元组可选断言Swift 是一门进行 iOS 和 OS X 应用开发的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。Swift 包含了 C 和 Objective-C 上所有基础数据类型,Int表示整型值;Double和Float表示浮点型值;Bool是布尔型值;String是文本型数据。Swift 还提供了两个基本的集合类型,Array和Dictionary,详见集合类型。就像 C 语言一样,Swift 使用 ......
控制流 发布时间: 2021-01-13 20:28:32 评论数: 0
本页包含内容:For 循环While 循环条件语句控制转移语句(Control Transfer Statements)Swift提供了类似 C 语言的流程控制结构,包括可以多次执行任务的for和while循环,基于特定条件选择执行不同代码分支的if和switch语句,还有控制流程跳转到其他代码的break和continue语句。除了 C 语言里面传统的 for 条件递增(for-condition-increment)循环,Swift 还增加了for-in循环,用来更简单地遍历数组(array),字典(dictionary),区间(range),字符串(string)和其他序 ......
@autoclosure 和 ?? 发布时间: 2021-01-12 12:46:38 评论数: 0
Apple 为了推广和介绍 Swift,破天荒地为这门语言开设了一个博客(当然我觉着是因为 Swift 坑太多需要一个地方来集中解释)。其中有一篇提到了一个叫做 @autoclosure 的关键词。@autoclosure 可以说是 Apple 的一个非常神奇的创造,因为这更多地是像在 “hack” 这门语言。简单说,@autoclosure 做的事情就是把一句表达式自动地封装成一个闭包 (closure)。这样有时候在语法上看起来就会非常漂亮。比如我们有一个方法接受一个闭包,当闭包执行的结果为 true 的时候进行打印:func logIfTrue(predicate: () ......
关于语言附注 发布时间: 2021-01-09 08:53:45 评论数: 0
本页内容包括:如何阅读语法本书的这一节描述了Swift编程语言的形式语法。这里描述的语法是为了帮助您更详细的了解该语言,而不是让您直接实现一个解析器或编译器。Swift语言相对小点,这是由于在Swift代码中几乎无处不在的许多常见的的类型,函数以及运算符都由Swift标准库来定义。虽然这些类型,函数和运算符不是Swift语言本身的一部分,但是它们被广泛用于这本书的讨论和代码范例。如何阅读语法用来描述Swift编程语言形式语法的记法遵循下面几个约定:箭头(→)用来标记语法产式,可以被理解为“可以包含”。句法范畴由斜体文字表示,并出现在一个语法产式规则两侧。义词和标点符号由粗体固定 ......
动态类型和多方法 发布时间: 2021-01-07 15:30:25 评论数: 0
Swift 中我们虽然可以通过 dynamicType 来获取一个对象的动态类型 (也就是运行时的实际类型,而非代码指定或编译器看到的类型)。但是在使用中,Swift 现在却是不支持多方法的,也就是说,不能根据对象在动态时的类型进行合适的重载方法调用。举个例子来说,在 Swift 里我们可以重载同样名字的方法,而只需要保证参数类型不同:class Pet {} class Cat: Pet {} class Dog: Pet {} func printPet(pet: Pet) { println("Pet") } func printPet(cat: Cat) { ......
将 protocol 的方法声明为 mutating 发布时间: 2021-01-04 12:44:27 评论数: 0
Swift 的 protocol 不仅可以被 class 类型实现,也适用于 struct 和 enum。因为这个原因,我们在写给别人用的接口时需要多考虑是否使用 mutating 来修饰方法,比如定义为 mutating func myMethod()。Swift 的 mutating 关键字修饰方法是为了能在该方法中修改 struct 或是 enum 的变量,所以如果你没在接口方法里写 mutating 的话,别人如果用 struct 或者 enum 来实现这个接口的话,就不能在方法里改变自己的变量了。比如下面的代码protocol Vehicle { var nu ......
typealias 和泛型接口 发布时间: 2021-01-01 16:15:32 评论数: 0
typealias 是用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰。使用的语法也很简单,使用 typealias 关键字像使用普通的赋值语句一样,可以将某个已经存在的类型赋值为新的名字。比如在计算二维平面上的距离和位置的时候,我们一般使用 Double 来表示距离,用 CGPoint 来表示位置:func distanceBetweenPoint(point: CGPoint, toPoint: CGPoint) -> Double { let dx = Double(toPoint.x - point.x) let dy = Do ......
Swift 中的测试 发布时间: 2020-12-30 08:05:04 评论数: 0
在软件开发中,测试的重要性不言而喻。Xcode 中集成了 XCTest 作为测试框架,Swift 代码的测试默认也使用这个框架进行。关于 XCTest 的使用方法,比如像 setUp,tearDown 以及 testxxx 等在 Swift 下和以前也并没有什么不同,作为一本介绍 tip 的书籍,我不打算在此重复这些。如果对测试的理论基础和实践方法感兴趣的话,不妨看看 Objective-C 中国上相关的话题文章。XCTest 中测试和待测试的 app 是分别独立存在于两个不同的 target 里的。这在 Swift 2.0 之前使测试 Swift 代码时面临了由访问权限带来的 ......


友情链接: php5000技术知识分享 github 码云 开源中国 csdn linux中国 阿里云 unix技术网 composer中文网 php packagist php python 安卓软件 大众源码 DevStore 猪八戒威客网 人人都是产品经理 PHPwind论坛 互联网的一些事 新客网 黑马程序员 火星时代 hao123it ThinkSNS 开源社区 51CTO学院 办事儿网 IT论坛 java教程 最代码 程序员客栈 大数据培训 小程序开发 微信小程序 php开发新闻 微信小程序 java学习 微信小程序 Linux书籍 网站ip流量 xw素材网 新浪云 腾讯云 华为云 百度 新浪 网易 淘宝 腾讯 1688 搜狐 优酷 房天下 hao123 携程 天涯社区