Playground 与项目协作 发布时间: 2021-07-23 21:24:40 评论数: 0
我们提到过使用 Framework 的方式来组织和分离代码。除了能够得到更清晰的架构层次和方便的代码重用外,我们还能通过这个方式得到一个额外的好处,那就是在项目的 Playground 中使用这些代码。一般来说,最主要的使用 Playground 的方式可能是建立单独的 Playground,然后在其中实验一些小的代码片段和 API。但是在实际开发中,我们面临的更多的是针对具体项目的问题。如果我们想在单独的 Playground 中使用我们已经写的类或者方法的话,我们只能将这些类和方法的代码复制到 Playground 中,然后再进行依赖于它们的实验。这样的做法非常麻烦:迅速地 ......
正则表达式 发布时间: 2021-07-22 10:39:06 评论数: 0
作为一门先进的编程语言,Swift 可以说吸收了众多其他先进语言的优点,但是有一点却是让人略微失望的,就是 Swift 至今为止并没有在语言层面上支持正则表达式。大概是因为其实 app 开发并不像 Perl 或者 Ruby 那样的语言需要处理很多文字匹配的问题,Cocoa 开发者确实不是特别依赖正则表达式。但是并不排除有希望使用正则表达式的场景,我们是否能像其他语言一样,使用比如 =~ 这样的符号来进行正则匹配呢?最容易想到也是最容易实现的当然是自定义 =~ 这个运算符。在 Cocoa 中我们可以使用 NSRegularExpression 来做正则匹配,那么其实我们为它写一个 ......
造个类型不是梦-白话Swift类型创建 发布时间: 2021-07-20 14:57:21 评论数: 0
本页包含内容:自定义原型实现默认值支持基本布尔型初始化支持Bool类型判断支持兼容各们各派的类型完善OCBool的布尔基因体系小伙伴们,Swift中的Bool类型有着非常重要的语法功能,并支撑起了整个Swift体系中的逻辑判断体系,经过老码的研究和学习, Bool类型本身其实是对基础Boolean类型封装,小伙伴们可能咬着手指头问老码,怎么一会Bool类型,一会Boolean类型,其区别在于,前者是基于枚举的组合类型,而后者则是基本类型,只有两种true和false。自定义原型接下老码根据Bool的思想来创建一个OCBool类型,来让小伙伴们了解一下Swift中到底是怎么玩儿的 ......
Options 发布时间: 2021-07-19 05:49:26 评论数: 0
不要误会,我们谈的是 Options,不是 Optional。后者已经被谈论太多了,我不想再在上面再多补充什么了。我们来说说 Options,或者在 Objective-C 中的 NS_OPTIONS,在 Swift 中是怎样的形式吧。在 Objective-C 中,我们有很多需要提供某些选项的 API,它们一般用来控制 API 的具体的行为配置等。举个例子,常用的 UIView 动画的 API 在使用时就可以进行选项指定:[UIView animateWithDuration:0.3 delay:0.0 ......
AnyClass,元类型和 .self 发布时间: 2021-07-15 20:15:08 评论数: 0
在 Swift 中能够够表示 “任意” 这个概念的除了 Any 和 AnyObject 以外,还有一个 AnyClass。AnyClass 在 Swift 中被一个 typealias 所定义:typealias AnyClass = AnyObject.Type通过 AnyObject.Type 这种方式所得到是一个元类型 (Meta)。在声明时我们总是在类型的名称后面加上 .Type,比如 A.Type 代表的是 A 这个类型的类型。也就是说,我们可以声明一个元类型来存储 A 这个类型本身,而在从 A 中取出其类型时,我们需要使用到 .self:class A { } ......
集合类型 (Collection Types) 发布时间: 2021-07-12 09:14:49 评论数: 0
翻译:zqp校对:shinyzhu, stanzhai, feiin集合类型 (Collection Types)本页包含内容:数组(Arrays)集合(Sets)字典(Dictionaries)集合的可变性(Mutability of Collections)Swift 语言提供经典的数组和字典两种集合类型来存储集合数据。数组用来按顺序存储相同类型的数据。字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对)。Swift 语言里的数组和字典中存储的数据值类型必须明确。 这意味着我们不能把不正确的数据类型插入其中。 同时这也说明我们完全可以对获取出的值类型 ......
随机数生成 发布时间: 2021-07-10 10:51:01 评论数: 0
随机数生成一直是程序员要面临的大问题之一,在高中电脑课堂上我们就知道,由 CPU 时钟,进程和线程所构建出的世界中,是没有真正的随机的。在给定一个随机种子后,使用某些神奇的算法我们可以得到一组伪随机的序列。arc4random 是一个非常优秀的随机数算法,并且在 Swift 中也可以使用。它会返回给我们一个任意整数,我们想要在某个范围里的数的话,可以做模运算 (%) 取余数就行了。但是有个陷阱..这是错误代码let diceFaceCount = 6 let randomRoll = Int(arc4random()) % diceFaceCount + 1 println(r ......
模式匹配 发布时间: 2021-07-07 00:52:23 评论数: 0
在之前的正则表达式中,我们实现了 =~ 操作符来完成简单的正则匹配。虽然在 Swift 中没有内置的正则表达式支持,但是一个和正则匹配有些相似的特性其实是内置于 Swift 中的,那就是模式匹配。当然,从概念上来说正则匹配只是模式匹配的一个子集,但是在 Swift 里现在的模式匹配还很初级,也很简单,只能支持最简单的相等匹配和范围匹配。在 Swift 中,使用 ~= 来表示模式匹配的操作符。如果我们看看 API 的话,可以看到这个操作符有下面几种版本:func ~=<T : Equatable>(a: T, b: T) -> Bool func ~=< ......
获取对象类型 发布时间: 2021-07-04 19:30:57 评论数: 0
我们一再强调,如果遵循规则的话,Swift 会是一门相当安全的语言:不会存在类型的疑惑,绝大多数的内容应该能在编译期间就唯一确定。但是不论是 Objective-C 里很多开发者早已习惯的灵活性,还是在程序世界里总是千变万化的需求,都不可能保证一尘不变。我们有时候也需要引入一定的动态特性。而其中最为基本但却是最为有用的技巧是获取任意一个实例类型。在 Objective-C 中我们可以轻而易举地做到这件事,使用 -class 方法就可以拿到对象的类,我们甚至可以用 NSStringFromClass 将它转换为一个能够打印出来的字符串:NSDate *date = [NSDate ......
继承(Inheritance) 发布时间: 2021-07-01 19:21:51 评论数: 0
本页包含内容:定义一个基类(Base class)子类生成(Subclassing)重写(Overriding)防止重写一个类可以继承(inherit)另一个类的方法(methods),属性(property)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。在 Swift 中,类可以调用和访问超类的方法,属性和下标脚本(subscripts),并且可以重写(override)这些方法,属性和下标脚本来优化或修改它们的行为。Swift 会检查你的重写定 ......
初始化返回 nil 发布时间: 2021-06-30 12:42:45 评论数: 0
在 Objective-C 中,init 方法除了返回 self 以外,其实和一个普通的实例方法并没有太大区别。如果你喜欢的话,甚至可以多次进行调用,这都没有限制。一般来说,我们还会在初始化失败 (比如输入不满足要求无法正确初始化) 的时候返回 nil 来通知调用者这次初始化没有正确完成。但是,在 Swift 中默认情况下初始化方法是不能写 return 语句来返回值的,也就是说我们没有机会初始化一个 Optional 的值。一个很典型的例子就是初始化一个 url。在 Objective-C 中,如果我们使用一个错误的字符串来初始化一个 NSURL 对象时,返回会是 nil 代 ......
swizzle 发布时间: 2021-06-27 16:36:27 评论数: 0
Swizzle 是 Objective-C 运行时的黑魔法之一。我们可以通过 Swizzle 的手段,在运行时对某些方法的实现进行替换,这是 Objective-C 甚至说 Cocoa 开发中最为华丽,同时也是最为危险的技巧之一。因为 Objective-C 在方法调用时是通过类的 dispatch table 来用 selector 对实现进行查找的,因此我们在运行时如果能够替换掉某个 selector 对应的实现,那么我们就能在运行时 “重新定义” 这个方法的行为。如果你不太理解的话,可以想象成某个类能响应的方法是存放在一个类似字典的结构中的,键为方法的名字 (也就是 se ......
下标脚本(Subscripts) 发布时间: 2021-06-24 19:35:25 评论数: 0
本页包含内容:下标脚本语法下标脚本用法下标脚本选项下标脚本 可以定义在类(Class)、结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象、集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法。举例来说,用下标脚本访问一个数组(Array)实例中的元素可以这样写 someArray[index] ,访问字典(Dictionary)实例中的元素可以这样写 someDictionary[key]。对于同一个目标可以定义多个下标脚本,通过索引值类型的不同来进行重载,而且索引值的个数可以是多个。译者:这里附属脚本重载在本小节中原文并没有任 ......
Selector 发布时间: 2021-06-21 09:22:14 评论数: 0
@selector 是 objc 时代的一个关键字,它可以将一个方法转换并赋值给一个 SEL 类型,它的表现很类似一个动态的函数指针。在 objc 时 selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由 selector 来负责的。在 objc 里生成一个 selector 的方法一般是这个样子的:-(void) callMe { //... } -(void) callMeWithParam:(id)obj { //... } SEL someMethod = @sele ......
Any 和 AnyObject 发布时间: 2021-06-18 02:24:30 评论数: 0
ny 和 AnyObject 是 Swift 中两个妥协的产物,也是很让人迷惑的概念。在 Swift 官方编程指南中指出AnyObject 可以代表任何 class 类型的实例 Any 可以表示任意类型,甚至包括方法 (func) 类型先来说说 AnyObject 吧。写过 Objective-C 的读者可能会知道在 Objective-C 中有一个叫做 id 的神奇的东西。编译器不会对向声明为 id 的变量进行类型检查,它可以表示任意类的实例这样的概念。在 Cocoa 框架中很多地方都使用了 id 来进行像参数传递和方法返回这样的工作,这是 Objective-C 动态特性的 ......
动态类型和多方法 发布时间: 2021-06-15 19:37:48 评论数: 0
Swift 中我们虽然可以通过 dynamicType 来获取一个对象的动态类型 (也就是运行时的实际类型,而非代码指定或编译器看到的类型)。但是在使用中,Swift 现在却是不支持多方法的,也就是说,不能根据对象在动态时的类型进行合适的重载方法调用。举个例子来说,在 Swift 里我们可以重载同样名字的方法,而只需要保证参数类型不同:class Pet {} class Cat: Pet {} class Dog: Pet {} func printPet(pet: Pet) { println("Pet") } func printPet(cat: Cat) { ......
代码组织和 Framework 发布时间: 2021-06-13 18:29:48 评论数: 0
Apple 为了 iOS 平台的安全性考虑,是不允许动态链接非系统的框架的。因此在 app 开发中我们所使用的第三方框架如果是以库文件的方式提供的话,一定都是需要链接并打包进最后的二进制可执行文件中的静态库。最初级和原始的静态库是以 .a 的二进制文件加上一些 .h 的头文件进行定义的形式提供的,这样的静态库在使用时比较麻烦,我们除了将其添加到项目和配置链接外,还需要进行指明头文件位置等工作。这样造成的结果不仅是添加起来比较麻烦,而且因为头文件的路径可能在不同环境下会存在不一样的情况,而造成项目在换一个开发环境后就因为配置问题造成无法编译。有过这种经历的开发人员都知道,调配开发 ......
断言 发布时间: 2021-06-12 14:09:35 评论数: 0
断言 (assertion) 在 Cocoa 开发里一般用来在检查输入参数是否满足一定条件,并对其进行“论断”。这是一个编码世界中的哲学问题,我们代码的使用者 (有可能是别的程序员,也有可能是未来的自己) 很难做到在不知道实现细节的情况下去对自己的输入进行限制。大多数时候编译器可以帮助我们进行输入类型的检查,但是如果代码需要在特定的输入条件下才能正确运行的话,这种更细致的条件就难以控制了。在超过边界条件的输入的情况下,我们的代码可能无法正确工作,这就需要我们在代码实现中进行一些额外工作。一种容易想到的做法是在方法内部使用 if 这样的条件控制来检测输入,如果遇到无法继续的情况, ......
REFLECTION 和 MIRROR 发布时间: 2021-06-10 15:18:48 评论数: 0
熟悉 Java 的读者可能会知道反射 (Reflection)。这是一种在运行时检测、访问或者修改类型的行为的特性。一般的静态语言类型的结构和方法的调用等都需要在编译时决定,开发者能做的很多时候只是使用控制流 (比如 if 或者 switch) 来决定做出怎样的设置或是调用哪个方法。而反射特性可以让我们有机会在运行的时候通过某些条件实时地决定调用的方法,或者甚至向某个类型动态地设置甚至加入属性及方法,是一种非常灵活和强大的语言特性。Objective-C 中我们不太会经常提及到 “反射” 这样的词语,因为 Objective-C 的运行时比一般的反射还要灵活和强大。可能很多读者 ......
PRINTABLE 和 DEBUGPRINTABLE 发布时间: 2021-06-08 06:07:47 评论数: 0
在 Playground 和 Swift REPL 中这实现这两个接口并不会对原来输出产生影响,因此如果您需要验证本节代码内容的话,请在实际的工程项目中进行。在定义和实现一个类型的时候,Swift 中的一种非常常见,也是非常先进的做法是先定义最简单的类型结构,然后再通过扩展 (extension) 的方式来实现为数众多的接口和各种各样的功能。这种按照特性进行分离的设计理念对于功能的可扩展性的提升很有帮助。虽然在 Objective-C 中我们也可以通过类似的 protocol + category 的形式完成类似的事情,但 Swift 相比于原来的方式更加简单快捷。Printa ......


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