Tag: swift

Swift 5中的ABI稳定性–这是什么?

从事Swift工作的人谈到了长期目标,即稳定macOS,iOS,watchOS和tvOS的Swift ABI。 这实际上是什么意思? ABI ABI代表Application Binary Interface ,它定义编译的代码如何与其他编译的代码交互。 这意味着我们需要具有良好的调用约定,命名,对象在内存中的布局等。ABI的用途包括用户运行的程序与操作系统之间的接口,该接口将定义如何在机器代码中访问结构。 ABI还是API? API代表应用程序编程接口 ,这是一个较高级别的接口,通常Swift程序员可以访问该接口访问基于库或基于Web的系统。 ABI兼容性是什么意思? 缺乏ABI兼容性将意味着编译后的代码将无法在运行时与其他编译后的代码进行交互。 因此,有意义的是,Swift始终具有ABI,并且随着语言的成熟,它一直在稳步发展。 那么ABI稳定性对Swift意味着什么 具有兼容ABI的已编译Swift代码(例如应用程序或库)可以彼此交互。 这可以采用相互定义的调用函数和方法的形式,并在它们之间的API边界上来回传递值。 ABI稳定性 为了获得ABI稳定性,Swift需要锁定关键方面或为向前兼容做好准备。 ABI稳定性意味着要使用特定的Swift版本编译一个Swift库,并且仍然能够在运行时从使用更高版本的Swift构建的应用程序中与它进行交互。 同样,使用比特定Swift库更早的Swift版本构建应用程序仍然可以编译和运行。 未来 Swift 5向前发展将允许使用未来版本的编译器进行编译的框架/ SDK仍然可以正常工作。 Swift 5还有其他一些很棒的功能,因此当然还有很多值得期待的地方! 官方资源:https://swift.org/blog/abi-stability-and-more/

将C ++库与Swift集成-如何构建

在“ Objective-C和Swift —友好相处”一文中,我谈到了如何使用Objective-C在Speculid中将C ++库与Swift集成在一起。 今天,我将讨论在XCode项目中使用C ++库的挑战。 Speculid是一个完全开源的应用程序,主要在Swift中使用最新版本的Xcode(10.1)构建(我将主要而不是仅解释其中的原因)。 借助Speculid,您可以拍摄一张图形并将其构建为完整的应用程序图标或图像集。 因此,这意味着将所有必需的依赖项打包在.App包中。 最初,我考虑将Inkscape和ImageMagick包含在安装中。 但是, Inkscape具有其他依赖项(例如XQuartz)这一事实意味着这太麻烦了。 因此,开罗和librsvg成为显而易见的选择。 将Cairo和librsvg与Swift集成 Speculid的第一个版本需要安装两个软件包:Inkscape和ImageMagick。 每个应用程序将以某种组合方式用于读取,操作和导出SVG,PNG,JPEG或PDF文件。 结果, 需要这些软件包使用户体验笨拙且困难。 但是,由于它们是完整的应用程序,包括这两个程序包也将很麻烦。 这就是为什么我着眼于集成C ++库的原因-特别是其中的两个: Cairo 和 libRSVG 。 Cairo和librsvg由多个软件包使用,是图形和SVG操作软件开发的领先库,尤其是在开源和Linux社区中。 因此,在Speculid v2.0中,我将这些库集成并打包为读取PNG和SVG以及导出PDF和PNG文件的主要方法 。 最重要的是,可以使用以下命令通过HomeBrew在Mac上安装这两个库: brew install cairo librsvg 现在,我们需要确保复制和链接文件。 正确链接和复制C ++库 为了使用C ++库, 我们可以将每段C ++代码作为它们各自的库编译在Speculid中,也可以集成已编译的库。 最初,似乎编译代码是最干净,最有效的方法,除了每个库都有很多要求以及用于编译每个库的特殊标志的事实。 因此,我决定采取另一种方法,并自己使用编译的库。 使用HomeBrew安装库之后,将Cairo和librsvg的目录复制到您的项目文件夹中。 HomeBrew将其应用程序和库存储在: /usr/local/Cellar 因此,例如, 开罗将位于: /usr/local/Cellar/cairo 将其复制到您的项目后,文件需要处于构建阶段的三个位置: 与库链接-所有.dylib文件都需要列出 复制文件-所有.dylib文件都需要复制到Frameworks文件夹 标头 -所有.h文件都需要在Project下列出 之后,您应该会很好。 […]

Xcode Bots:使用Swift Package Manager构建项目

Xcode Bots当前不支持Swift Package Manager项目。 但是可以将它们构建为macOS应用程序,甚至可以获取IDE中显示的代码覆盖率报告。 如果还没有为Swift Package Manager创建一个新的Xcode项目(请注意:不要检查版本控制中的项目文件,因为这对SPM项目来说是不好的做法): 迅捷包generate-xcodeproj 将以下设置应用于您的Bot配置。 (您甚至可以检查“分析”操作) 选择匹配的测试设备。 添加预集成脚本以快速创建项目文件,这是使用所有Xcode Bot功能和下载所有依赖项所必需的。 #/ bin / bashcd mia-cli 快速构建 迅捷包generate-xcodeproj cp -r xcschemes mia-cli.xcodeproj / xcshareddata / 交易 快速生成Xcode项目文件意味着所有Scheme和用户首选项都将丢失。 但是您可以将* .xcscheme目录从项目文件中复制(以* .xcproject结尾)到存储库中的另一个位置,并将其检入版本控制中(如果对方案进行更改,则必须再次执行此操作) )。 生成Xcode项目时,您可以将目录再次复制回您的项目文件中。 瞧!

自动布局和UICollectionViewCells:动态大小调整和动画第1部分

确保像上面的我的一样设置您的应用程序。 删除Main.storyboard并不是完全必需的,但是由于您没有使用它,因此最好将其删除。 现在,由于我们以编程方式进行了所有操作,因此需要对AppDelegate的didFinishLaunchingWithOptions函数进行一些更改。 将以下代码添加到该函数: 窗口= UIWindow(框架:UIScreen.main.bounds) 让 firstScreen = ViewController() 让 navController = UINavigationController(rootViewController:firstScreen) 自我 .window?.rootViewController = navController 自我 .window?.makeKeyAndVisible() 上面的大多数代码应该是不言自明的。 我们将窗口设置为具有整个屏幕定义的框架的窗口,创建UIViewController和UINavigationController,然后将UIViewController设置为UINavigationController的根视图控制器。 然后,使UINavigationController成为窗口的根视图控制器。 该makeKeyAndVisible函数使窗口可见,并将窗口移到最前面。 在运行应用程序之前,将此行(或类似内容)添加到ViewController文件的viewDidLoad函数中: 自我 .view.backgroundColor = UIColor.red 运行该应用程序,现在您的屏幕应该是红色(或您选择的任何颜色),顶部带有一个栏。 我们将继续进行讨论,即UINavigationController。 现在该开始UICollectionView了,这需要一些代码才能开始。 我将复制以下代码,并从中摘录: 自动布局最重要的行是collectionView.translatesAutoresizingMaskIntoConstraints = false 如果没有这一行,Swift将尝试为您将UICollectionView的Autoresizing Mask转换为Auto Layout约束,而我们希望成为决定视图约束的对象。 在ViewController文件的顶部,您将要确保正在实现UICollectionViewDataSource,UICollectionViewDelegate和UICollectionViewDelegateFlowLayout协议。 当Xcode询问您是否要添加协议存根时,请继续添加它们。 您的ViewController文件应如下所示: 此时,您应该有一些占位符代码和一个错误,阻止您在设备上运行该应用程序。

最佳Swift 3代码段

1.将PHAsset转换为UIImage: 对于Swift 3.0.1: 资源:https://gist.github.com/lvterry/f062cf9ae13bca76b0c6#file-getassetthumbnail-swift 2.快速获取屏幕截图(相册)数量 您可以尝试以下操作: 注意:使用此代码是Swift 3 来源:http://stackoverflow.com/a/42195558/4935811 3. UIButton自定义 您可以尝试使用此扩展圆形按钮: 联系我们 电子邮件:sourleangchhean168@gmail.com Stackoverflow:酸辣豆蔻

Swift Con XCTest的密码

Una de lasprinciples dudas a la hora de querer实现者单元测试使用Swift,no saberqué框架,como configurarlo和cuales pruebas escribir。 您可以使用XCTest的框架或其他工具 。 Funciona muy bien,es muyfácilde configurar和sobre todo muyfácilde usar。 可轻松实现XCTest的集成Xcode,并以简单的方式实现Xcode的缺陷。 Tenemos dos opciones a la hora de Implementarlo,在没有新的合作伙伴的情况下,在新的和新的合作伙伴之间进行合作。 不动产公司 通用X编码和新的通用编码,可以使用cascas函件和清单进行单向激活。 普遍存在的不动产 巴拉圭人参政党和巴拉圭人民党的存在。 Solamente necesitamos agregar una nueva unidad de pruebas unitarias。 特纳莫斯的香蒜酱 Hay que dar da clic albotónde agregar en la […]

开始Swift编程第1部分-变量,常量和类型

我知道那里有很多教程,Apple有很多学习Swift的资源,包括他们的WWDC视频(即使较旧的视频仍然有用,所以不要害怕几年前的视频)。 保罗·哈德森(Paul Hudson)的系列文章“用Swift入侵”非常适合概念学习,而他的系列文章就是我的入门方式。 Ray Wenderlich也提供了一些非常深入的教程,但是大多数教程都要求您在到达API之前就具有一定的知识。 我依靠Ray Wenderlich一次过。 最后,我找到了Cocoacasts,以获取有关核心数据的信息。 我想每两天在这个系列中创建一个新的部分。 根据主题所涉及的内容,可能需要更多时间来编写。 本教程与众不同 许多教程向您展示了如何做某事,几乎没有解释为什么您以某种方式做某事。 我的目标是教您如何尽我所能,以及增加社区反馈。 许多教程一次将所有内容都扔给您,我计划详细介绍该主题。 您会慢慢学习,但是到完成每个部分时,我希望我能够比在其他地方阅读相同内容所能教给您的更多。 本教程是什么 本教程的设计方式是,您将学习Swift编程的基础知识。 我将教的很多东西都可以转移到其他语言,但是所有语法都是用Swift编写的,使用相同语法的里程可能会有所不同。 虽然本教程并非旨在教您如何制作您的第一个应用程序(请参见下文),但它会教您一次又一次地用于制作第一个应用程序的基本构建基块。 本教程不是什么 本教程不会教您如何使用Xcode或如何制作第一个移动应用程序。 我不会讲授如何构建用户界面,使用自动布局,如何使用“在此处插入框架”或iOS中使用的各种文件类型。 也许将来,我会写一些系列文章,深入探讨其他主题,但是目前,我的唯一目标是教授语言以及事物与语言的关系。 系列目标 整个系列的目的不是要推出另一个几乎一无所知的程序员,而是要教新的程序员真正的编程。 从课堂和实践的角度,使读者对程序设计有一个更好的理解。 使新程序员更好地理解概念,这些概念将通过面试和整个职业生涯为他们提供帮助。

迅捷4 –可腐化和可编码💼

大家好🤚🏼 我已经几个月没写新文章了,原因有很多(第一个是WWDC’18),但是我现在不谈论这个。 去吧去吧🤟🏼 编码和解码自定义类型 使您的数据类型可编码和可解码,以与JSON等外部表示兼容。 Swift标准库定义了一种用于数据编码和解码的标准化方法。 您通过在自定义类型上实现可Encodable和可Decodable协议来采用这种方法。 采用这些协议可以使Encoder和Decoder协议的实现获取您的数据,并在外部表示形式(例如JSON或属性列表)中对数据进行编码或解码。 为了同时支持编码和解码,请声明对Codable符合Codable ,后者将Encodable和Decodable协议结合在一起。 此过程称为使您的类型可编码 。 来源:点击这里 如您所见,这些是处理原始JSON片段最重要的事情。 在某些情况下, 一些人认为对于复杂的JSON结构很难。 在我这方面,这是不可接受的。 特别是,在Apple推出Encodable和Decodable之后,使用JSON粒子播放变得非常简单。 有两种编码和解码协议 。 如; 可编码和可分解 。 可编码的只是代表这两个协议的类型别名。 typealias Codable = Decodable & Encodable 显然,您可以使用此类型别名来编码和解码 。 CodingKeys允许您使用特定的变量名称来表示JSON密钥。 可以根据外部表示进行解码的类型。 我们的JSON片段如下。 JSON片段 让我们发现盒子里发生的事🎉 可解码协议的示例 可以将自身编码为外部表示形式的类型。 可编码协议的示例 如果您有任何具体问题,请不要犹豫与我联系。 推特:@ strawb3rryx7 传播这个词

Swift 4中的可编码和可解码

在iOS的日常开发中,许多任务涉及调用API和Web服务,将数据保存到磁盘以及使用自定义类型对对象进行建模,这些对象代表应用程序的用例和功能。 这样做时,我们必须将数据与中间格式(JSON,属性列表)之间进行转换。 对于数据编码和解码任务,Swift提供了可编码和可解码协议。 通过确认这些协议,可以将自定义类型编码到外部表示形式(例如JSON和Property List(pList))并从中解码。 在本文中,我将介绍如何使用Encodable和Decodable在JSON和JSON之间转换自定义类型实例,以及使用这两种协议进行编码和解码任务的许多方面。 编码方式 将您的自定义类型实例转换为其他表示形式(例如JSON和pList)的过程称为编码或序列化。 对于编码,自定义类型符合Encodable协议。 解码 将诸如JSON或pList之类的表示形式的数据转换为自定义类型的实例的过程称为解码或反序列化。 对于解码,自定义类型符合可解码协议。 可编码 为了同时支持编码和解码,自定义类型可以符合Codable协议,而后者又符合Encodable和Decodable 。 typealias可编码=可编码和可解码 自动编码和解码 默认情况下,Swift Standard Library和Foundation Framework中的许多类型(例如Int,String,Data,URL,Date等)都是可编码的。 若要使任何自定义类型自动变为可编码,它应符合可编码协议,并且其所有存储的属性都应是可编码的。 例如,这是一个表示Movie的结构。 struct Movie { var movieId:Int? 变量名称:字符串?} 只需遵循Codable,即可对Movie类型进行编码和解码。 struct Movie:可编码{ var movieId:Int? 变量名称:字符串?} 同样,具有自定义类型属性的自定义类型是可编码的,只要其所有属性都是可编码的即可。 例如,假设我们有MovieDetail结构来表示电影细节​​。 struct MovieDetail:可编码{ var语言:字符串? var genre:字符串? var releaseDate:字符串? var bannerImageUrl:字符串?}结构电影:可编码{ var movieId:整数? var名称:字符串? var movieDetails:MovieDetail?} 由于MovieDetail也符合Codable,因此Movie也可编码。 Swift集合类型(例如Array , Dictionary和Optional只要包含Codable类型,就变为Codable。 […]

UIGraphicsImageRenderer

用于创建支持Core Graphics的图像的图形渲染器。 总览 您可以使用图像渲染器完成绘图任务,而无需处理诸如颜色深度和图像比例之类的配置,也无需管理Core Graphics上下文。 使用诸如图像输出尺寸和格式之类的参数初始化图像渲染器。 然后,您可以使用多个绘图功能之一来渲染共享这些属性的图像。 渲染图像: (可选)创建UIGraphicsImageRendererFormat对象,以指定渲染器用于创建其上下文时应使用的非默认参数。 实例化UIGraphicsImageRenderer对象,提供输出图像的尺寸和格式对象。 如果您不提供格式对象,则渲染器会对当前设备使用明智的默认设置,如创建图形图像渲染器中所示。 根据所需的输出选择一种渲染方法: image(actions:)返回一个UIImage对象; jpegData(withCompressionQuality:actions:)返回JPEG编码的Data对象; 和pngData(actions:)返回一个PNG编码的Data对象。 执行选择的方法,提供Core Graphics绘图指令作为闭包参数,如使用Image Renderer创建图像中所示。 使用“混合模式”演示了一些可在绘图说明中使用的更高级的渲染功能。 (可选)您可以在提供给渲染方法的绘图说明中使用Core Graphics绘图代码,如使用Core Graphics渲染功能中所示。 初始化图像渲染器后,您可以使用它来绘制具有相同配置的多个图像。 图像渲染器保留了Core Graphics上下文的缓存,因此重用同一渲染器比创建新渲染器更有效。 样例代码 参考文献 UIGraphicsImageRenderer 您可以使用图像渲染器完成绘图任务,而无需处理诸如颜色深度和颜色等配置 。developer.apple.com