Tag: swift

Swift中的元组之美

Swift中的Tuple是什么: 元组是swift中可以容纳多个类型的复合类型。而非常简单的元组是可以容纳零个或多个类型的类型。 像一个元组可以容纳Int String bool或任何其他数据,即使它可以容纳其他复合类型和名称类型。 在苹果文档中: 元组类型是用括号括起来的零个或多个类型的逗号分隔列表。 了解元组是值类型而不是引用类型更重要。 句法 : var(元组名称)=(type1,type2) var myTuple =(100,“ String”)//这里的元组具有2个值Int和String 元组可以创建两种方式的隐式定义类型或显式定义类型: 明确定义: var tupleOne:(Int,String)=(12,“ Ekram”) 在这里,我们明确定义了元组类型(Int,String) 明确定义的类型: var tupleTwo =(“ Ekram”,true) 这里这个元组上的两个元素两个是字符串,另一个是布尔 使用名称类型创建: 我们也可以这样定义类型元素名称 var tupleTwo =(name:“ Name”,isOky:true) 访问元组: 我们可以通过两种方式访问​​元组元素 按名字 例: var tupleTwo =(name:“ Name”,isOky:true) 现在我们可以像这样通过名称访问这两种类型 var name = tupleTwo.name var nameIsOky = tupleTwo.isOky 按索引 我们可以像这样通过它们的索引访问元组元素 创建一个元组 var tupleThree […]

Heimdall:为Vapor编写HTTP请求记录器

本文是Heimdall源代码的简要概述,并说明了为Vapor Web Framework编写第三方插件的过程。 去年,一位导师建议我为Vapor Web框架编写一个记录器。 最初,这似乎是一个复杂的任务,但结果再简单不过了。 让我们创建一个插件! 创建一个Swift包 蒸气插件必须是快速软件包,因此可以使用Swift Package Manager导入。 因此,首先需要在终端上运行以下命令来创建一个快速包。 麦克迪尔·海姆达尔 光盘海姆达尔 swift package init –type可执行文件 这将创建以下目录结构。 删除Sources目录中的main.swift文件。 Heimdall只是2个快速文件,而且少于200行代码! 以下是这两个文件的说明,没有实现细节。 如果您想查看所有代码,请参考github repo。 记录仪 HTTP记录器做什么? 它访问有关每个请求和响应的信息,例如状态码,HTTP方法等,并将其写入文件。 您需要创建一个“中间件”,该中间件针对每个请求运行,并将数据简单地写入文件。 以下代码片段显示了没有实现细节的基本中间件。 类记录器:中间件{ var path:字符串=“〜/ Logs / logfile.txt” //此方法针对每个Web请求运行 公共功能响应(请求:请求, chainingTo next:Responder)throw-> Response { //从响应对象访问数据 writeToFile(dataToBeLogged) } func writeToFile(path:){ //编写写入文件的快速代码 } } 记录仪与蒸气项目集成的提供商 现在您有了一个记录器,但是其他开发人员将如何在您的项目中导入您的记录器? 要添加功能或为Vapor创建第三方程序包,您需要创建一个“提供程序”。 提供者提供了一种在Vapor Web App中导入第三方程序包的统一方法。 […]

如何拆卸大量Singleton iOS应用

一生中至少有一个iOS开发人员至少从一个年轻的人或其他人那里继承了一个遗留项目,而当iOS开发成为独立开发人员的黄金竞赛时,其他人曾编写过代码。 那时,我们中只有少数人关心测试,可测试性,体系结构或模式。 只有大量的视图控制器,关心限制崩溃的数量,关心无限数量的功能和单例。 有很多单身人士。 Singleton非常容易用Swift中的1行代码和Objective C中的5行代码来实现,易于从应用程序中的任何地方调用,并且最好是弄乱代码以防止单元和UI测试。 本文的目的是为您提供一种有效且快速的工具,以解开任何单身汉,无论数量多少。 我将使用一个代码片段来给出我上面所描述的示例,并模拟3个单例服务和一个示例视图控制器。

Instagram的缩放/平移手势教程

*********本教程是使用Swift 3.0创建的******** Instagram具有很多魔力,并且作为当今最流行的应用程序之一,它提高了对其他应用程序的期望。 作为用户,我们常常忽略了出色应用程序的精妙之处,并且我们期望达到某种标准。 Instagram帖子上的缩放功能是这些标准之一。 本教程着重于复制该行为。 我是Rep的产品和工程负责人,Rep是一个有影响力的市场,品牌和有影响力的人可以在市场营销活动中进行协作。 我决定分享如何将此功能内置到用户个人资料中以放大照片。 我已经在下面附上了一些已完成结果的剪辑,但是为了详细介绍所有内容,我们将从头开始,并逐步解决它。 在项目设置中向左/向右移除风景,保留“纵向”选择。 好的,设置完成。 让我们开始编写我们的UI。 我喜欢以编程方式进行所有操作,但是如果您习惯IB,那么也可以这样做。 单击“ ViewController.swift”文件,然后添加表视图和数据源。 在创建带有要放大的图像的自定义单元之前,我们将使用UITableViewCell作为占位符。 现在是继承代码。 // ViewController.swift 导入UIKit 类ViewController:UIViewController { var tableView:UITableView! 覆盖func viewDidLoad(){ super.viewDidLoad() //加载视图后进行其他任何设置,通常是从笔尖进行。 view.backgroundColor = .orange setUpTableView() } func setUpTableView(){ tableView = UITableView() tableView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(tableView) 让const:[NSLayoutConstraint] = [ tableView.topAnchor.constraint(equalTo:topLayoutGuide.bottomAnchor), tableView.leadingAnchor.constraint(equalTo:view.leadingAnchor), tableView.trailingAnchor.constraint(equalTo:view.trailingAnchor), tableView.bottomAnchor.constraint(等于:bottomLayoutGuide.topAnchor) ] NSLayoutConstraint.activate(const) tableView.register(UITableViewCell.self,forCellReuseIdentifier:“ cell”) tableView.dataSource =自我 […]

Swift 4 Introduction系列1.5 — Swift数据类型元组

通过将2个或多个基本数据类型分组为单个复合数据类型来形成元组。 元组的每个元素可以是任何Swift基本数据类型。 元组中的每个元素之间的数据类型可以不同。 由于元组可以包含许多不同的类型,因此我们可以从任何类型的排列中创建元组。 元组不适合复杂和持久的数据结构。 对于复杂而持久的数据结构,我们应该使用结构或对象类。 要创建一个常量元组,我们使用相同的关键字let,然后使用关键字var来创建变量元组。 常量和变量的行为与Swift基本数据类型相同。 常量是不可变的,变量是可变的。 我们可以用字符串和整数组成一个元组,如下所示: 让contact =(“我的名字”,22341176) 要访问元组中的元素,我们使用从0开始的索引。 例: 0 接触1 像往常一样,我们也可以通过先声明一个元组来创建一个元组。 我们只需要将所有不同的数据类型放在方括号中即可,并用逗号将它们分开。 例: 让address1 :(字符串,字符串) address1.0 =“ A座公寓” address1.1 =“新泽西州” 地址1.0 地址1.1 请注意,尽管我们可以先声明常量而不分配数据。 这不是最佳实践。 为了声明常量,我们应该在同一条语句中声明并分配它们。 这是为了使我们的代码更安全。 我们只应声明元组,然后在绝对必要时分配数据。 对于变量,即使我们没有要输入的数据,也应首先声明和初始化变量。 创建元组变量的首选方法是使用以下方法同时创建和初始化变量。 var contact1 =(String(),Int()) contact1.0 contact1.1 contact1.0 =“这是一个测试” contact1.1 = 2132 contact1.0 contact1.1 contact1.0 =“大卫” contact1.1 = 76788779 contact1.0 contact1.1 对于元组中的每个元素,我们可以具有相同的数据类型。 […]

快速提示:文档

在编写漂亮的“自我文档”代码和添加自己的解释性注释之间,代码文档始终是拉锯战。 自我记录代码始终是目标,但有时简单的注释将有助于您节省时间和精神疲劳。 为了帮助您达到适当的平衡,我们收集了一些有用的文档提示,可在您的代码库中使用。 Xcode带有方便的功能,称为快速帮助。 这是在Option + Clicking代码库时看到的漂亮的文档弹出窗口。 该文档还显示在“实用工具”抽屉的“快速帮助”面板中。 快速帮助功能通过允许您记住实际操作的实际情况,可以真正地节省大量时间。 您还可以创建自己的快速帮助文档。 在类,结构,枚举,属性,方法等上方直接以/// …或/** … */形式的注释将呈现为快速帮助。 在此注释中,您可以使用类似于Markdown的语法来编写丰富的文档,其中包括基本的文本格式,示例代码,链接,甚至是图像和视频。 有关所有详细信息,请参见Apple的标记格式参考。 当光标位于函数上时,要记住的方便快捷方式是Command + Option + / 。 这将自动为您的函数生成一个可随时填写的模板,包括参数列表和返回类型。 专家提示:游乐场具有自己独特的文档功能,包括将特殊注释( /*: … */和//: … )呈现为精美的,类似于打印的格式的能力,非常适合为您的团队或团队构建培训材料甚至用作演示媒体。 有时候,您只需要一个简单的注释即可帮助您慢走记忆或指出代码中有些棘手的内容。 以下是一些有用的约定: // MARK:可用于概述代码。 这些与属性和方法声明一起显示在跳转栏中。 它们是Swift的#pragma mark -版本。 // TODO:在标记将来的工作位置时非常有用,尤其是在布置完成当前任务所需的子任务时。 这些特殊注释显示在Xcode的跳转栏中,因此我想通过将内容包装在星号上来使其脱颖而出(例如// TODO: *** … *** )。 评论应简短而切题。 如果需要提供更多信息,请将其放在下一行的另一条注释中。 您的代码库不应堆满未完成的TODO。 我们将在短期内讨论一种防止这种情况的方法。 // FIXME:与TODO类似,除了它通常表示损坏的东西,而不是不完整的东西。 这些应该遵循与TODO类似的约定,包括不要长期坚持。 // NOTE:当留下有关某项工作原理的信息或指出特殊注意事项时,遵循的有用约定。 // […]

Vingle纹理样式指南

我们希望喜欢iOS和Texture的任何人对本指南有所帮助! 1.制作UI组件 对条件 UI组件使用惰性属性 。 否则,即使根本不使用给定的UI组件,您最终也会进行不必要的分配和计算 不要使用节点生成功能 ! 我们建议使用automaticManagesSubnodes而不是addSubnode 。 将所有UI组件属性置于Const结构中。 2. LayoutSpec // MARK:和// MARK: – #pragma mark -在Objective-C中与#pragma mark和#pragma mark -等效。 推荐使用扩展,用于layoutSpec 代码的凝聚力 和可读性。 请勿将所有代码都放在layoutSpecThatFits:上以便阅读 有意义的layoutSpec分隔。 (文章) 方法名称必须以“ LayoutSpec”结尾。 本地layoutSpec变量名称必须以“ Layout”结尾。 覆盖func layoutSpecThatFits(:)-> ASLayoutSpec { 让~~~~ layout = ~~~~ layoutSpec(:) } FlexBox属性应在layoutSpecThatFits处定义: 建议创建弹性样式的糖代码,如下面的屏幕快照所示。 3.任何与主线程视图相关的属性访问都必须在didLoad方法中处理。 4.反应式编程(* RxSwift) RxSwift社区/ Rx可可纹理 RxCocoa纹理扩展库。 通过创建一个 github.com 来为RxSwiftCommunity / […]

注释cacher les clefs d’API dans les应用程序Swift

实用程序«.plist»倒股票和其他方面的API.Contexte:Git,Github,Xcode,Swift 注释utiliter Github倾注了部分申请,没有livrer les clefs人员d’API? 消除无用票据,无用证据和使用限制。 即时报刊,收养收养人杂志: 1倒立清单咖啡机les clefs ex /«ApiKeys .plist» dans le projet Xcode 2 Ajouter ce fichier de clef dans la liste«.gitignore»des fichiersà忽略者 3 Ecrire une fon d’accèsaux clefs,dans un fichier swift。 前/«ApiKeys.swift» 4 Utiliser la fuction pourrécupérerles clefs 1Créerle fichier«Apikeys.plist»dans Xcode 2 Ajouter ce fichier de clef dans la liste«.gitignore»des fichiersà忽略者 […]

iOS Developer首席财务分析师🚀

从Lead Finance Analyst过渡到iOS Developer的18个月过渡的简短见解。 2015年12月 🏦 我是26岁的结构化财务分析师。 我正在开发和使用高级现金流量模型来领导对亿万结构性金融交易的分析。 听起来很酷,但事实并非如此。 2016年一月 由于对技术领域的好奇心,我开始了一个副项目Boolerang.co.uk-一个 伦敦科技工作平台。 很有趣。 我正在学习新的编程语言,开发新技术,并通过在线平台将软件工程师与雇主联系起来。 我一直很喜欢编程,但是从没有如此接近这个领域的机会。 2016年4月 🚀 全职。 Finance 0,Boolerang1。我离开了首席结构财务分析师的职位,全职从事Boolerang的工作。 自从大学期间在洛杉矶工作以来,这是我与工作相关的工作中获得的最大乐趣。 这也是我去过的最“失业”的时期,这真是令人恐惧。 👻 话虽这么说,伦敦的技术人才需求/供应差距令人难以置信地令人难以理解,这为我的决定提供了支持。 到本月底,Boolerang已有200多名雇主发布工作,并且软件工程师似乎很容易找到并吸引该平台-尤其是当我在“没有招聘人员的地方”下线时。 😆 iOS工程师并非如此。 2016年五月 生活是美好的。 Boolerang很好。 关于越来越难以捉摸的“ iOS工程师”,我与雇主之间的对话越来越多。 他们表面上的稀缺使我想起了异国情调的阿凡达(Avatar)风格的“ unobtainium”。 因此,我下载了Xcode,这是Apple的iOS驱动的IDE。 没什么… 2016年9月 我在9–9工作。 Boolerang上为9–6,iOS开发上为6–9。 Boolerang正在连接600位雇主和8’000位软件工程师。 我绝对非常喜欢iOS开发。 技术,集成等等,还有一些CocoaPods…👌 2016年12月 🙏 Boolerang需要专职人员,而且获得帮助比我想象的要容易。 现在,我可以花更多的时间在“ iOS’ing”上,同时知道Boolerang具有继续增长所需的一切。 全力以赴。 2017年三月 到这个时候,我已经构建了34个未发布的iOS应用程序,并观看了来自斯坦福大学,苹果大学,乌迪米和树上小屋的数百次演讲。 我的三个金融学前同事离开这个行业,通过Makers Academy /大会寻求软件相关的工作(我认为我对财务和专业技术的不断评论最终通过🙈获得了)。 iOS开发方面的职业? 此时的重返金融的想法令人发笑,没有吸引力,而且Boolerang绝对不如18个月前那么性感。 […]

像老板一样联网— RxSwift简介

在几乎每个应用程序中,您都将需要联网。 我们如此努力,以至于一段时间后它变成了第二自然。 RxSwift的伟大之处在于,它使联网变得轻而易举,尤其是从JSON解析模型时。 在此示例中,我们将假设您有一个使用connect()方法处理网络的View模型。 我将从Udemy课程提供指向我的一个Gist的链接,该链接将为我们提供一些可使用的JSON。 观测值和订阅 创建可观察对象时,您定义其行为。 事情是存在一个可以观察到的可观察的事物,而当您这样做时,我们的内存就会出现问题。 这就是为什么看起来很奇怪,我们在创建可观察对象时必须返回一次性对象。 这将使我们有机会取消正在做的事情,这在使用网络时特别方便。 单打 单打是更具体的可观察变量,它们返回一个值或一个错误,这在我们的JSON将返回或将出现错误的情况下是完美的。 它确实使用了方便的成功/错误枚举以及模式匹配。 func connect()-> Single { return Single .create(subscribe:{single in 让url =“ https://gist.githubusercontent.com/isaacmendez/9ef13dfe10f668c2cd433ec1d99f92bc/raw/cd6c72578caa1ba0c4376af40813f1a995ab580e/inspringQuotesDataModel.json” Observable.from([url]) .map { 让url = URL(string:$ 0)! 返回URLRequest(url:url) } .flatMap { URLSession.shared.rx.response(请求:请求) } .subscribe(onNext:{[弱自我]响应, 守卫让json =试试? JSONDecoder()。decode([[[String:String]]。self,from:data)else { 单(.error(URLError.couldNotPullData)) 返回 } 让newTitle = json [0] [“ quote”] ?? “你们都不要引号” 单(.success(newTitle)) } […]