我在说的api调用看起来像这样: 在这里,我们正在Almofire类上调用一个称为request的方法。 接下来是一个称为validate(statusCode:)方法,然后是另一个名为validate(contentType:) 。 最后,我们可以看到一个名为responseData的方法,该方法带有一个trailing closure ,该trailing closure返回api调用的输出。 它是如何工作的?? 好吧,逻辑很简单。 使函数可链接非常容易,并且可以允许我们使用几乎类似于DSL的语法进行编写。 我们将添加一个执行某些操作的新函数,然后返回 self 。 就这么简单。 让我们更清楚一点。 我们通常有一个init方法来初始化类的对象。 我们可以有多个designated convenience初始化程序,以使我们的工作更加轻松。 我们可以使用自定义参数来初始化类对象。 考虑一个叫做Celcius的类。 class Celsius {var temperatureInCelsius:Doubleinit(fromFahrenheit华氏度:Double){temperatureInCelsius =(fahrenheit — 32.0)/ 1.8} init(fromKelvin kelvin:Double){temperatureInCelsius = kelvin — 273.15} func printTemperature(){print(“温度为( temperatureInCelsius)”)}} 我们有两种初始化方法,一种以kelvin接受温度,另一种以fahrenheit接受温度。 下面的语法创建一个Celcius类的对象,并使用该对象,我们可以调用一个实例方法。 摄氏(来自开尔文:400).printTemperature() //打印温度为126.85 如果您知道上面的代码是如何工作的,那么很容易理解本文开头提到的almofire方法链接。 链接方法示例: 让我们创建一个APICaller类。 一个api调用通常有一个url ,一个http method和parameters 。 如果我们使用上述类进行API调用,它将看起来像这样。 let params = [“ key1”:“ […]
MobileOptimized 2017于7月14日至15日在白俄罗斯明斯克举行。 第1天是“ 营业日 ”,第2天是“ 技术日 ”。 这次会议得到了许多公司和社区的支持👐 “ SATOSHI ”位于此板顶部的第四行。 这是第二天的时间表。我的演讲从13:00在iOS曲目👩💻👨💻开始 我谈到了使用REPL和Swift软件包管理器的Swift。 我的幻灯片如下。 为了清楚显示,我简化了示例。 我很高兴有很多与会者来听我的演讲,所以我很高兴与他们交谈! 🤓 变色龙贴纸🌀 这是我第一次访问白俄罗斯,但我喜欢在那里度过。 谢谢所有组织者和所有参加者! 😃
嗨,这是我的第一篇关于编程的文章,用英语,如果您发现下面的任何错误,您可以(或者更好,您必须)告诉我,我会尽快修复。 因此,今天我将讨论Xcode中的完成快捷方式。 在同一部分中,您可以使用故事板或xib进行工作,如UILabel,UIButton,UIViewController等,该工作表中包含许多代码示例,C Block typedef,C ++ Class Template,但很少有人知道我们可以添加(或删除)新代码段。 您只需要选择一段代码,在上面显示的框中单击并拖动它即可。 释放它时,将显示一个带有以下选项的弹出窗口: 标题 :将在列表中显示的标题。 摘要 :关于该快捷方式的一些解释。 平台 :IOS,tvOPS,watchOS,macOS(定义何时启用快捷方式)。 完成快捷方式 :这很重要,它将是我们用来调用快捷方式的名称。 语言 :快捷方式的语言,例如Swift,C,Objective-C等。 完成范围 :例如,如果您选择了Function或Method ,则可以在其中调用快捷方式 ,当您开始编写快捷方式的名称时,它就会出现在您选择的快捷方式中。 对话框字段供您编写代码。 因此,还有一件事情,当您调用一个方法并点击“ Tab”按钮时,它将把您的光标发送到下一个要完成的字段,在这里我们也可以使用代码来做到这一点: 例如: apiClass.get(,完成:{(数据)在 }) 现在,我们需要对其进行测试,放手 只需开始编写快捷方式apiClassGet的名称-记住方法内部: 然后点击“选项卡”或“输入”按钮 看,我们在注册正文或快捷方式时写了,现在此字段将显示为深蓝色。 如果在点击“ Tab”按钮时用放置了许多字段,则光标将移至下一个字段。 如果您有任何疑问或意见,请随时给我写信。
在WWDC18上,有一个有关“测试中的新增功能”的会议,描述了代码覆盖率,XCTest和XCUITests中的新功能。 它由Honzaand Ethan提出。 本届会议包括以下内容 xccov的代码覆盖率 从方案中选择测试 随机检验 并行测试 并行测试技巧 幸运的是,我已经在以前的博客文章中介绍了本次演讲中介绍的大多数内容。 由于xccov已随Xcode 9.3一起启动,因此我在个人博客和Medium上都写了一篇详细的博客文章,内容涉及xccov的所有功能。 Xcode 10宣布了Xcode 10的并行测试功能,我已经在行动博客文章中介绍了Xcode 10中的大多数并行测试,该文章也发表在了Medium上。 您随时可以随时在会话中观看实时演示。 但是,我们将简要介绍本届会议上提到的功能。 代码覆盖率 苹果已经发布了带有Xcode 9.3的新命令行工具xccov,用于检查Xcode代码覆盖率报告的内容。 我们可以通过编辑方案并在“测试”操作中选中“代码覆盖率”框来明确启用该方案的代码覆盖率。 使用代码覆盖率数据运行测试后,Xcode会将代码覆盖率报告生成到默认的派生数据目录中,该目录位于〜/ Library / Developer / Xcode / DerivedData中,您将在Logs / Test目录中看到生成的代码覆盖率报告。 我们将看到扩展名为.xccovreport和.xccovarchive的代码。 在Logs / Test目录中,有覆盖率报告(扩展名为.xccovreport)和覆盖率存档(扩展名为.xccovarchive)。 按照此实用程序的手册页,“覆盖率报告包含每个目标,源文件以及具有覆盖率信息的功能/方法的行覆盖率百分比。 Coverage存档包含报告中每个文件的原始执行计数”。 目前,我们可以使用xccov实现以下目的 从终端查看代码覆盖率报告 从代码覆盖率报告中吐出JSON。 列出所有已生成代码覆盖率的文件 查看一个特定文件的代码覆盖率报告。 观看如何查看实际的代码覆盖率。 这减轻了使用第三方工具以美观的格式显示Xcode代码覆盖率报告的麻烦。 我们也可以跳过不需要的目标的代码覆盖范围。 XCTest方案选项 使用Xcode 10,我们可以从方案中选择特定的测试,将测试随机化并并行执行测试。 我们可以通过更新方案来启用并行测试,并且在“测试”操作中,可以针对测试包选择“选项”以选择并行化选项。 我们也可以选择位置。 通过创建仿真器的克隆,测试可以扩展到并行化单个仿真器中的测试套件。 Xcode在后台创建了不同的运行程序流程,每个流程都分配了特定的测试。 可以使用xcodebuild工具从命令行运行XCTest。 使用Xcode […]
我们花了三天的时间,一直下降到两位数。 现在,无需再理会的错误了。 我们必须使用助手视图来并排修复剩余的错误。 大多数错误被证明是对类vars的可选类型的错误猜测。 Converter始终选择隐式展开的变量,而不是可选变量。 否则它将尝试猜测局部变量类型错误。 (您不需要在大多数时候声明变量类型,因为Swift可以推断出它们)。 只是因为我渴望看到该应用程序已构建,所以我选择了一条捷径。 我使用强制展开和强制强制转换只是为了消除构建错误。 我几乎不知道,以后我将为此付出高昂的代价。 一堆var允许转换后(转换器将所有变量都定义为var),我们有了一个内置的应用! 别这么大肆宣传,我们才刚刚开始。 是的,我们的应用正在构建中,但是没有返回任何数据并且在启动时崩溃。 我们花了接下来的100个小时进行调试,以查找所有 空错误 if not null检查,则错误, 以及许多可选性修复。 之后,我们的应用程序正在初始化。 那是“差不多”的铸造,还有另一个力解开错误。 有样式指南的原因。 它们可以帮助您按照设计使用的语言来使用该语言,并且可以在创建大多数错误之前将它们阻止。 当时,SwiftLint进行了营救。 您可以在Xcode上运行SwiftLint来查看所有样式指南异常,并快速对其进行修复。 我决心摆脱所有可选性错误,并尽可能与风格指南保持联系。 我甚至启用了加入规则。 修复样式不仅有助于提高可读性,而且还提高了我们对错误的信心。 我们在途中发现了其他错误。 我们摆脱了所有强制展开,强制转换,显式类型声明以及隐式展开的可选内容。 我们尽可能地if let和guard let语句成为可能。
Xcode菜单栏>窗口>设备和模拟器 设备和模拟器 选择您连接的设备。 选中“通过网络连接”框。 就这样! 设备名称旁边的网络图标表示已连接。 如果您遇到问题,请尝试在两个设备上打开和关闭Wifi; 并确保您可以从开发Mac实际ping您的设备。 您还可以通过转到“ 遥控器和设备”>“远程应用程序和设备”并从Mac配对来远程构建到AppleTV。 推特: @aaronykng IG: @ hi.aaron
下一页 :IOS面试常见问题解答(2019年4月)第二部分 什么是可可粉? Cocoa和Cocoa Touch分别是OS X和iOS的应用程序开发环境。 Cocoa和Cocoa Touch都包含Objective-C运行时和两个核心框架: Cocoa (包括Foundation和AppKit框架)用于开发在OS X上运行的应用程序。 Cocoa Touch (包括Foundation和UIKit框架)用于开发可在iOS上运行的应用程序。 2. Swift 5有什么新功能? https://medium.com/ios-expert-series-or-interview-series/whats-new-in-swift-5-0-25dc37f56f29 3. Nil和NULL之间的区别? 4. AnyObject和Any之间的区别? Any可以代表任何类型的实例,包括函数类型。 随着Swift 3的发布, AnyObject和Any含义已经改变。 在Swift 3中,Objective-C中的id类型现在映射到Swift中的Any类型,该类型描述任何类型的值,无论是类,枚举,结构还是任何其他Swift类型。 此更改提高了Swift和Objective-C的兼容性。 例如,从Swift 3开始,Objective-C集合可以保存Any类型的元素。这意味着Foundation的NSArray类型可以存储String , Float和Int实例。 AnyObject是所有类隐式遵循的协议。 当您需要无类型对象的灵活性时,或者使用桥接的Objective-C方法和返回无类型结果的属性时,可以使用AnyObject 。 AnyObject可用作任何类,类类型或仅类协议的实例的具体类型。 AnyObject协议还可用于弥补Swift和Objective-C之间的鸿沟。 一些Objective-C API使用AnyObject协议来提供与Swift的兼容性。 5.什么是@synthesize和@dynamic? @synthesize将为您的属性生成getter和setter方法。 @dynamic只是告诉编译器,getter和setter方法不是由类本身实现的,而是由其他地方实现的(例如超类或将在运行时提供)。 使用propertyName提及@dynamic会告诉编译器不要创建访问器方法,因为用户将来会动态提供实现。 苹果允许其开发人员在运行时使用动态方法解析提供方法实施。 6.什么是inout参数? 传递给Swift函数的所有参数都是常量 ,因此您无法更改它们。 如果需要,可以传入一个或多个参数inout ,这意味着可以在函数内部更改它们,这些更改反映在函数外部的原始值中。 func doubleInPlace(number: inout Int) { […]
将新值添加到可观察值? 向主题问好。 开发应用程序时,通常需要在运行时将新值手动添加到可观察对象上,并将其发送给订阅者。 我们想要的是既可以观察又可以充当观察者的东西。 这称为主题 。 主体既充当可观察者又充当观察者。 他们可以接收.next事件,并且每次接收到事件时,它都会转身并将其发送给其订户。 RxSwift中有四种主题类型 PublishSubject :开始为空,仅向订阅者发出新元素。 BehaviorSubject :从初始值开始,然后将其或最新元素重放给新订户。 ReplaySubject :使用缓冲区大小初始化,并将保留最大大小的元素的缓冲区并重播给新订户。 BehaviorRelay :包装BehaviorSubject,将其当前值保留为状态,并仅向新订阅者重播最新/初始值。 发布主题 让我们创建一个PublishSubject,在上面添加一些订阅者,并在运行时添加一些值。 请记住,PublishSubject会向订阅者发出新的元素,因此,为了使订阅者获取值,订阅之后必须发生.onNext事件。 输出: 第一:下一个(1) 第一:下一个(2) 第一:下一个(3) 第二:下一个(3) 第一:下一个(4) 第二:下一个(4) 第二:下一个(5) 第三名:下一个(5) 有道理吧? 订阅者等待.onNext事件以获取值。 订阅后,订阅者将从PublishSubject接收值,直到订阅被释放。 行为主体 使用与以前相同的代码,只是主题类型有所不同。 输出: 第一:下一个(初始值) 第一:下一个(1) 第一:下一个(2) 第二个:next(2) 第一:下一个(3) 第二:下一个(3) 第一:下一个(4) secord:下一个(4) 第三名:下一个(4) secord:下一个(5) 第三名:下一个(5) 如您所见,输出的主要区别在于,发生订阅时,订阅者会立即打印该值。 记得? BehaviorSubject从初始值开始,然后将其或最新元素重放给新订阅者。 重播主题 输出: 第一:下一个(1) 第一:下一个(2) 第二个:next(1) 第二个:next(2) […]
Objective-C ile kod yazarkençokkullandığım地幔diye birkütüphanevardı。 披风说说模型objelerimioluştururkenuyarlamak zorundakaldığım-initWithCoder:-encodeWithCoder:gibimetodlarıbenim yerime otomatikoluşturuyordu。 Bir ekstraözelliğiis objenintümdeğerlerinigüzelbirşekildebasacakşekilde-描述metodunu otomatikdoldurmasıydı。 Böylecekodda debug yaparken herhangi bir Mantle iletanımlanmışobjenindescription’ınıdebug console’abastığımda,tümobjenindetayınıgörebiliyordum: Swift ile birlikte模型对象Mantlekullanmayıbıraktım,zira Mantle sadece NSObject olan objelerüzerindeçalışabiliyordu。 Kendi定制objelerimioluşturuyordum。 Swift’te bir objeninkarşılığınıbasmakiçin描述样式,名称和名称CustomStringConvertibleprotokolünüekleyerekyapıyordum。 Bu protokol mutlaka bir描述değerikoymayızorunlukılıyordu。 Burada ise tek tektümdeğerleriELLE basacakşekildeyazıyordum,bu daçokzamanalıyordu: “ Bunun kolay bir yoluolmalı” diyedüşünüparaştırdımamabulamadım。 Belki deyanlışşekildearadımbilemiyorum。 达哈·索纳(Switzerland)Swift标准图书馆dokümantasyonunabakarken Mirror diye bir […]
预习 资源 项目 https://github.com/calmone/iOS-UIKit-component 参考 UIButton类 https://developer.apple.com/reference/uikit/uibutton 快乐编码😄