Swift是比Objective-C最好的编程语言。 它是iOS和OS X应用程序的另一种编程语言。 它于2014年6月首次引入。它基于C和Objective-C的最佳发展,而不受C兼容性的限制。 它收集了安全的编程示例,并包含了当今的重点,以创建要求不高且更具灵活性的编程。 它也有一个新的时间表,该时间表由发达且备受推崇的Cocoa和Cocoa Touch框架所维持。 这是选择快速选择目标c的一些主要原因: 开源编程语言 Swift编程语言是发展最快的开源语言。 这释放了该语言,使其能够在多种平台甚至后端基础架构上应用。 通过这种开源语言,Apple现在能够从iOS应用程序开发社区创建反馈,以便在更标准的基础上进行增强。 Swift的流行之处在于它的设计和结构合理,这是因为它已得到全球数百万开发人员的支持。 高度安全 Swift提供了一个完整的安全框架,其中包括各种API,这些API用于交换证书,授权服务,信任策略,密钥,并对消息应用加密加密。 Swift辅助程序生成的应用程序在安全性方面均广为人知,他们在开发过程中均会建议这些应用程序,并作为最终产品的一部分提供给用户。 内存不足 Swift应用程序利用功能强大的库来构建这些库,这些库通过减小唯一的应用程序大小公开地加载到应用程序内存中。 这最终有助于提高应用程序的性能,同时使应用程序更小更轻。 功能丰富的应用 创建功能完备的应用程序可以解释对众多功能的关注,这些功能可以作为设备和操作系统的一部分,并且必须协同工作。 Swift应用程序开发使这一切都可行。 开发人员可以根据项目的需要方便地调用不同的功能,并且可以毫不费力地验证这些功能在设备上的外观和工作方式。 雇用Swift开发人员 当我们谈论iOS App开发时 ,公司经常有两种选择:Objective-C开发人员和Swift开发人员。 由于全力以赴的任务涉及基于Objective-C的应用程序开发和基于Swift的应用程序开发,因此使用前者标记的成本要比后者高得多。 保养 如果不先开发C,Objective-C的发展是不可行的。 相反,Swift没有这些依赖项,这使得它的维护变得容易得多。 C需要程序员维持两个代码文件,以开发代码的构造时间和有效性,这也适用于Objective-C。 更安全的平台 在可行的移动应用程序市场中,增强受保护的应用程序应该是优先事项。 Swift的语法和语言构造禁止在Objective-C中发生几种类型的错误。 这种恒定性意味着更少的死机和具有挑战性的动作。 它并没有避免程序员编写糟糕的代码,反而使编写错误的可能性降低。 这包括在开发过程中额外的质量控制层。 更少的代码和传统 有许多问题导致应用程序因Objective-C而崩溃。 Swift提供的代码错误很小,因为它对操作文本字符串和数据提供了内联支持。 此外,类不分为两部分; 接口和实现。 这样可以将项目中的文件数量减少一半,从而使处理起来更加容易。 速度 例如,通用对象排序将比Python中相同算法的执行运行得更早。 这也比Objective-C更好,后者比Python版本要快。 Swift支持动态库 动态库是可以连接到应用程序的可实现的大量代码。 随着时间的推移,这一方面允许当前的Swift应用程序链接到最新版本的Swift语言。 Swift中的精力充沛的库直接上传到内存中,从而缩减了应用程序的初始大小并最终改善了应用程序的独奏性。 如有任何疑问,请联系我们的iOS专业人士 。
欢迎来到第2部分:安装主题管理器。 如果需要检查第1部分,请继续。 我们始终需要灵活且易于管理的项目。 因为我们的客户总是想要更改和附加功能。 我首先向您推荐调色板。 这不仅仅用于Code Challenge,还用于您的下一个项目。 这里有一些例子 题 ? 我们如何用这种颜色构建IBOutlet。 我为所有颜色要求构建了用于颜色管理的DRL主题管理器 。 DRL主题管理器是一个Xcode Swift文件模板,用于生成为Swift项目创建主题所需的最大文件数。 安装模板后,它将创建DRL主题管理器。 安装 克隆此仓库 。 将此存储库的“ DRL主题管理器”目录的内容复制到/Library/Developer/Xcode/Templates/File Templates 。 重新启动Xcode并选择“文件>新文件”,或使用⌘N键盘快捷键。 选择“ DRL主题管理器”类别,然后选择“ DRL主题管理器”文件,然后单击“下一步”。 选择您要使用的许可证,然后单击“下一步”。 要么 只需在终端中键入以下命令。 $ git clone https://github.com/durul/DRL-Theme-Manager.git $ cd DRL主题管理器 $ ./install-templates.sh 如果在执行脚本文件时遇到权限拒绝错误,请为其授予执行权限。 $ sudo chmod 755安装模板.sh 更新资料 在项目目录中,在终端中按回车键输入以下命令。 open combat.xcworkspace 我们安装了标准的ThemeManager。 但是我想使用WWDC 2016调色板 。 首先,请使用以下代码更新ThemeManager.swift。 所有评论都非常重要。 因为Jazzy会自动为我们创建文档。 […]
我发现很多人通过搜索引擎访问了我在Swift中有关设计模式的文章。 因此,我在本文中收集了它们,以使读者可以轻松找到它们。 谢谢。 创作模式 Swift World:设计模式-简单工厂 如果我们想学习一种编程语言,我们需要忍受它。 这意味着尽可能多地使用Swift。 今天… medium.com Swift World:设计模式-工厂方法 您还记得我们在上一篇文章中讨论的简单工厂模式吗? medium.com Swift World:设计模式-Singleton 辛格尔顿在可可中非常受欢迎。 我们可以找到不同的用例。 以下是两个示例。 medium.com Swift World:设计模式-生成器 通常,在制造汽车时,我们首先制造每个零件,然后组装它们。 作为客户,我们不需要… medium.com Swift World:设计模式-抽象工厂 今天我们将讨论抽象工厂模式。 它处理更复杂的用例。 众所周知,轿车… medium.com 结构模式 Swift World:设计模式-适配器 我们已经完成了创建模式,并将在本文中介绍结构模式。 从字面上看,结构性… medium.com Swift World:设计模式-桥梁 您还记得我们的汽车系统结构吗? 我们有一个协议和不同的实现方式,例如下面的代码。 medium.com Swift World:设计模式-装饰器 装饰器是一种结构化模式,可在运行时向类或实例添加新功能。 与继承相比,它具有… medium.com Swift World:设计模式-外立面 从字面上看,facade表示 medium.com Swift World:设计模式-代理 今天,我们将讨论代理模式。 在这种模式下,代理是一个对象,可以帮助我们访问另一个对象。 […]
自动代码生成和开放源代码 这篇文章是该系列文章的第4部分,我们将探讨如何构建Firebase API的Swift扩展。 到目前为止,我们已经讨论过添加对Firebase Realtime Database API的Codable支持,添加定义数据库结构模式的类型安全路径以及向API添加RxSwift扩展。 在本文中,我们尝试将当前讨论的所有主题包装到两个非常轻量的框架中,这些框架可以轻松地包含在您自己的项目中。 这提供了无懈可击的Codable支持,键入安全路径和RxSwift扩展名-您可以选择想要使用的功能。 但是,在我们开始讨论开源框架之前,让我们看一个可以使我们的生活更轻松的主题: 自动代码生成 在有关类型安全路径的文章中,我们描述了一种使用Path类型的受约束扩展对层次结构建模的策略。 这些扩展要求键入很多样板。 诸如Sourcery和SwiftGen之类的工具由于一些很好的原因而变得流行: 样板很无聊,易于维护。 从某种形式的资产自动生成的代码将保持最新状态,因此,如果您删除或重命名资产,如果您的代码仍引用这些资产,则会立即出现编译错误。 因此,为何不必键入和维护大量的幻像类型和受约束的Path扩展,为什么不只定义您的模式并让代码自动生成呢? 考虑以下示例架构: { “ configuration”:“ Configuration”, “聊天室” : { “ ”:{ “邮件”:{ “ ”:“消息” }, “ name”:“ String” } } } 这将定义从结构的根部到叶节点的Paths ,这些Paths必须与代码中的模型类型名称相对应。 包裹在尖括号中的json键表示树中此刻的数据是集合的一部分。 您会注意到,没有实体定义聊天室。 出于上述架构的考虑,没有对应于聊天室的模型类型,但是您需要创建一个通往聊天室的路径才能获取该聊天室的消息。 这个概念是使用幻像类型建模的。 代码生成器将生成一个没有值的名为Chatroom的枚举。 这意味着Chatroom永远无法实例化,但仍可以在我们的代码中用作通用限制。 使用从以上架构生成的代码,您可以生成如下路径: 让messagesPath = Path()。chatrooms.child(“ firechat”)。messages 或者,您可以使用自动生成的便捷方法,该方法将.child(_ key:String)方法包装如下: 让messagesPath = Path()。chatroom(“ […]
该帖子最初发表在dcordero.me中。 在这里,您将始终找到更新的版本。 在iOS的世界中,确实有很好的框架来处理数据的持久性。 例如,Core Data是Apple提供的出色解决方案,即使在处理大量数据时也能提供令人难以置信的出色性能。 但是也有其他一些替代方法出现。 这些选择之一是Realm,据说它以更简单的语法提供比Core Data更好的性能。 但是可悲的是,在这个持久性世界中,没有什么能像预期的那样精彩。 还有很多问题。 我对Core Data,Realm或其中许多其他流行的持久性框架有非常不好的经验,这当然不仅是因为框架本身,还因为它们是如何应用于项目的。 主要问题在于,由于这些框架解决的问题非常复杂,因此它们倾向于具有相当复杂的语法。 而且,如果框架的范围没有明确定义,那么最终它们的对象往往会散布在整个项目中,找到从NSManagedObjects获取数据的UIView,使用RLMObjects填充单元的UICollectionViews等。 这种情况永远都不会发生,应用程序的持久性应该是非常内部的东西,应该隐藏在应用程序核心部分的最深层中,当然也不要与我们的UI层产生冲突。 最重要的部分是,将来替换掉所有这些代码部分以使用任何其他解决方案或框架应该非常容易。 这听起来像乌托邦,对吗? 但是……我们如何得到这个? 我们基本上只需要一个抽象解决方案,该解决方案定义一个接口来处理数据的持久性。 我的意思是使用数据源 。 注意:请不要将此数据源的概念与iOS用于填充某些TableViews,CollectionViews等的数据源混淆。 数据源 数据源从核心业务逻辑中提取持久性逻辑,并且无论框架的具体细节如何,都可以访问数据。 我们可以在Swift中使用非常简单的协议构建一个接口来管理数据源,该协议提供了完整的CRUD(创建读取更新删除)接口。 作为免责声明,我想在示例中保持简单,但是您是否听到了`BooksRealmDataSource`? 没有? 仿制药真的大声尖叫,不是吗? 🙃 储存库模式 现在,我们不必担心框架…想象一下让您的App的所有数据源实现先前协议的情况。 我的意思是,无论最终来自何处,总是以完全相同的方式访问信息。 磁盘,内存甚至网络。 它们全部来自完全相同的协议。 构建一个存储库 模式非常容易,该存储库 模式通过不同的数据源进行迭代可以从每种情况下从最快或更合适的源获取数据。 我们的存储库的实现再次要求泛型,只是收到泛型应管理的数据源列表以及适用于它们的策略。 例如,在上一个示例中,要获取我们的图书清单的存储库可能具有3个不同的数据源:内存,磁盘和网络。 具有首发比赛的策略。 但是用于进行用户登录的存储库将只有一个数据源(网络),以确保我们始终通过后端验证凭据。 最后,从应用程序的其余部分开始,这意味着无论数据来自何处,或内部使用了哪些框架,都使数据如魔术般神奇。 正是我们想要的数据。 就像我说的,最好的部分是,遵循这种模式,我们获得了巨大的模块化,并且我们可以在需要时很容易地更改内部实现。 您想尝试一下X新的流行框架吗? 好吧,只需更改您的一个数据源的实现,该应用程序的其余部分将完全不需要任何更改。
对图标使用超赞字体的好处是,您可以像对待文本一样对待它们。 它消除了使用同一图标的各种大小或各种颜色的png的需要,因为您只需设置字体大小或字体颜色即可产生您想要的效果。 从http://fontawesome.io/下载font-awesome 2.将fontawesome-webfont.ttf添加到您的项目。 3.确保已在要使用字体的目标中检查fontawesome-webfont.ttf文件的成员身份。 您可以通过在项目导航器中选择文件来执行此操作。 4.打开项目的Info.plist文件,然后添加项“您的应用程序中提供的字体”,并在其下添加.ttf文件的名称。 5.现在打开http://fontawesome.io/cheatsheet/并选择所需的“图标”,如下所示,然后按“ command + c”,即复制 6.现在,使用界面生成器打开xib。 假设我们在按钮上使用此图标,如下所示。 现在选择按钮,然后将复制的图标粘贴到“属性”检查器中显示的“ 标题”字段中。 之后,选择按钮的字体为“ FontAwesome”。 您也可以通过编程方式确定设置。
此故事描述了iOS开发人员如何应对OWASP Mobile Top 10 2016中的M1类别漏洞。该类别涵盖了平台功能的滥用或平台安全控件的使用失败。 在第2部分中,我们将介绍其他iOS功能,这些功能可能会错误地破坏应用程序的安全性。 缓存的应用程序快照 从iOS 7开始,系统会在您的应用程序进入后台时获取并缓存用户界面的屏幕截图。 屏幕截图以.ktx(iOS9)或.png(iOS10)格式存储在Library / Caches目录中(该目录未通过iTunes或iCloud备份): (App Folder)/Library/Caches/Snapshots/com.bundle.id.of.your.app/ 接口快照映像可以包含敏感数据。 为避免泄漏,请使用图像视图覆盖它,清除文本字段,隐藏标签等。使用applicationWillResignActive(_:) to hide information并使用applicationDidBecomeActive(_:) to restore original view 。 今日扩展缓存(仅适用于iOS10) 如果您的应用程序具有“今天”扩展名,则它将在/private/var/mobile/Containers/Data/PluginKitPlugin/具有UUID命名的目录 与应用程序的快照不同,Today扩展通过在/Library/Caches/com.bundle.id.of.your.app.with.widget.suffix/Cache.db缓存最后一个相关数据来保留其状态。 自动更正和安全的UITextField UITextField符合UITextInputTraits协议,该协议具有以下属性: var autocorrectionType: UITextAutocorrectionType文本对象是否跟踪未知单词并向用户建议更合适的替换候选对象。 为了学习新单词,来自具有自动更正功能的文本对象的所有文本都缓存在路径/User/Library/Keyboard/dynamic-text.dat中 var isSecureTextEntry: Bool判断文本对象是否应禁用文本复制,隐藏正在输入的文本并防止文本被缓存。 为了防止将诸如用户名和密码之类的敏感信息存储在dynamic-text.dat中,如果文本不可见,则将UITextFields设置为isSecureTextEntry状态,如果文本可见,则将autocorrectionType关闭。 副作用是,iOS尝试自动更正其名称不会使您的用户感到困惑。 相信我,那真的很痛。 粘贴板 在某些情况下,用户不希望在应用程序外部访问复制到粘贴板的文本。 iOS10和macOS Sierra甚至可以通过“ 通用剪贴板传递”功能彼此共享剪贴板的内容,这可能会将用户数据泄漏到(可能是受到破坏的)设备。 UIPasteboard类允许创建应用内粘贴板。 要从Handoff中排除纸板,请使用localOnly选项调用setItems(_:options:)方法。 网络缓存策略 通过URLSession加载的任何HTTP和HTTPS请求都将由URLCache处理,后者提供内存和磁盘缓存机制。 缓存数据库存储在Library / Caches目录中(该目录未通过iTunes或iCloud备份): (App Folder)/Library/Caches/com.bundle.id.of.your.app/Cache.db URLRequest实例通过将缓存策略设置为NSURLRequest.CachePolicy值之一来指定如何使用本地缓存: useProtocolCachePolicy-默认 […]
Chartkütüphanesi(https://github.com/danielgindi/Charts)和Swift突出显示了Bar Chart eklemekçokkolay。 Pod’Charts’şeklindePodfile’nızaekleyin。 Yandaki resimdegörüldüğügibi Storyboard’aeklemişolduğunuz视图Controller’ıniçerisine视图ekleyerek自定义类olarak条形图视图’ıseçiniz。 3)ArdındanView’ısürükleyipilgilisınıfabırakarak@IBOutlet @IBOutlet weak var barChartView: BarChartView! şeklindeoluşturunuz。 4)Aşağıdaverilenextension’ısınıfınızınenaltınayerleştiriniz。 5)Fonksiyonunuzu类方法unuzuniçerisineyerleştiriniz。 6)Fonksiyonuçağırınız: func setChart() 导入图表 extension BarChartView { private class BarChartFormatter: NSObject, IAxisValueFormatter { var labels: [String] = [] func stringForValue(_ value: Double, axis: AxisBase?) -> String { return labels[Int(value)] } init(labels: [String]) { super.init() self.labels = labels } } […]
我们经常需要在图像视图上模糊或在任何动态背景上模糊视图。 有两种方法可以完成此任务。 1.进行具有所需模糊效果的模糊视图,并添加任何标签。 2.具有模糊视图和鲜艳度视图。 然后在这些内容之上添加一些内容,例如文本。 添加模糊视图– 让blurEffect = UIBlurEffect(style:.regular)让blurEffectView = UIVisualEffectView(effect:blurEffect)blurredEffectView.frame = view.boundsview.addSubview(blurredEffectView) 添加标签以模糊视图 让tLabel:UILabel = UILabel()tLabel.text =“早上好” tLabel.font = UIFont(名称:“ Futura”,大小:30)tLabel.textColor = UIColor.white.withAlphaComponent(0.6)tLabel.frame = bluredEffectView。 contentView.boundsblurredEffectView.contentView.addSubview(tlabel) 添加活力和标签 让vibrancyEffect = UIVibrancyEffect(blurEffect:blurEffect)让vibrancyView = UIVisualEffectView(effect:vibrancyEffect)vibrancyView.frame = bluredEffectView.contentView.boundsvibrancyView.contentView.addSubview(tLabel)tLabel.frame = vibrancyView.contentView.contentView.contentView.contentView.contentView.contentView.contentView。 view.addSubview(blurredEffectView) 参考文献 RayWanderlich的UIVisualEffectView教程 使用UIVisualEffectView 关于模糊和鲜艳度的StackOverflow问题 OmniDev网站的模糊和鲜艳度指南 用Swift编写有关模糊和活力的文章
首先,我要对拍手的每个人表示感谢,对我以前的文章发表评论:“在Swift中编写网络层:面向协议的方法”。 经过评论中的反馈和更多研究后,我认为解决本文中建议的改进将是有益的。 我们可以对项目进行两个简单的修改,以改善其功能。 在我们先前的URLSession实现中,我们使用了URLSession.shared 。 此代码有效,但不是最佳方法。 每次发出请求时,我们都会实例化一个新会话。 建议有一个URLSession和多个任务。 以前的实现。要解决此问题,我们将在使用默认配置创建路由器时实例化会话。 您可以使用3种不同类型的配置来创建会话。 我建议您从Raywenderlich.com阅读本文。 使用此代码,我们可以创建一个会话并执行多个任务。 这里的另一个优势是,我们可以调整路由器初始化代码以具有会话参数,通过使用模拟,我们将使编写测试变得更加容易。 为此,我要感谢Koen Punt和ilya stroganov的评论。 我不知道URLQueryItem已经编码了我们的参数。 这是一个快速更新,只需删除 .addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)。 并做了。 我永远不会表现出我所了解的一切。 我在Medium上写作时正在学习所有这些内容。 有时候,我会引用自己的帖子来提醒如何实现目标。 具有终身学习者的态度将使人成长。 我喜欢分享自己的发现,并希望能在此期间帮助某人。 话虽如此,如果有任何主题,您可能希望我发表评论,请在评论中提及。 再次感谢您的所有👏🏾。 在Swift⚡️中继续学习和思考。