Tag: Swift编程

在iOS App中构建可重用的通用UITableViewController

TableView Controller是一个必不可少的UIKit组件,几乎每个iOS应用程序都使用TableView Controller组件来显示列表中的数据。 当我们要在UITableViewController显示不同类型的数据时,大多数时候我们会创建一个新的子类来显示相关的数据类型。 这种方法有效,但是如果我们的应用程序中有许多不同类型的数据,则可能导致重复和维护困难。 我们如何解决这个问题? 一种方法是,我们可以使用Swift通用抽象数据类型使用简单抽象来创建通用UITableViewController子类,该子类可用于使用Swift通用约束配置和显示不同种类的数据。 您可以在GitHub存储库中找到并构建源项目: alfianlosari / GenericTableViewController 通用UITableViewController实现的示例– alfianlosari / GenericTableViewController github.com 我们创建一个名为GenericTableViewController的UITableViewController子类,并添加2种类型的Generic T和Cell 。 我们添加了约束,即Cell必须是UITableViewCell子类。 T将用作数据的抽象,而Cell将被注册到UITableView并出队以将每行的数据显示为UITableViewCell 。 类 GenericTableViewController :UITableViewController { 变量 :[T] var configure:(Cell,T)-> Void var selectHandler:(T)-> Void init (items:[T],​​配置: @转义 (Cell,T)-> Void,selectHandler: @转义 (T)-> Void){ 自我 .items =项目 自我 .configure =配置 自我 .selectHandler = selectHandler 超级 .init(样式:.plain) self […]

带有NSLayoutConstraint的iOS动画,采用Swift 4和Xcode 10

大家好,我已经在Swift 4中使用NSLayoutConstraint尝试了一些简单的iOS动画。这是动画, 您可以在此处找到视频教程-Swift Dynamics 让我们进入代码。 请从此处下载入门应用程序。 入门应用程序在中心包含两个UIView和一个imageView。 首先,我将打开Main.storyboard并为Main.storyboard添加height和width约束。 之后,添加horizontal和vertical约束。 现在,我们将为top Orange view添加约束。 我在0处添加了前导,尾随和顶部约束。 将bottom约束添加到imageView’s垂直间距。 现在,为第二个视图添加行trailing和bottom约束。 将顶部约束添加到imageView’s垂直间距。 打开assistant Editor并为imageView创建一个引用。 为imageView的vertical约束创建一个引用。 打开ViewController.swift并创建另外两个变量 var minHeight:CGFloat = 0.0 var viewCenter:CGFloat = 0.0 minHeight是我们可以垂直滚动到的最大值(顶部或底部)。 viewCenter是视图的中心。 这里的要点是限制平移手势只能在垂直方向上移动。 因此,我将编写UIPanGestureRecognizer的扩展。在UIPanGestureRecognizer ,我们将覆盖touchsMoved(_ touches: _ event: )函数。 每次我们拖动imageView时都会调用此方法。 在此函数内,我们必须计算阻力的velocity 。 从速度中我们可以检查运动是horizontal运动还是vertical运动。 如果velocity.x值大于velocity.y值,那么我们将取消运动。 这是最终代码, 类PanDirectionGestureRecognizer:UIPanGestureRecognizer { init(目标:AnyObject,操作:选择器){ super.init(target:target,action:action) } 覆盖func touchesMoved(_ touches:Set ,事件:UIEvent){ super.touchesMoved(触摸,带有:事件) 如果状态==。开始{ 令vel […]

Swift中的SOLID原理

SOLID是罗伯特·C·马丁(Robert C. Martin)在软件编程中使用的助记词缩写,它表示面向对象编程的5条原则。 单一责任原则 O笔已关闭 利斯科夫的替补 接口隔离 倾向倒置 这些原则解决了糟糕的架构问题,例如 美味佳肴 -某个地方的更改会破坏意外的部分,如果没有良好的测试覆盖范围,则很难跟踪。 固定性 -组件很难在另一个项目中重用或在同一项目的多个位置中使用,因为它具有许多依赖性。 易怒 -进行大量更改,因为它会影响多个部分。 这些SOLID原则不是严格的规则,而只是提高体系结构质量的准则。 让我们一一探究原理

用Swift 3向iOS应用打个招呼–第1部分

这个故事是关于一个对iOS和Swift不了解的Android开发人员如何开发适用于iPhone的应用程序。 基本上,关于我的故事,由于对Java / Android已有多年的了解,所以希望学习iOS。 iOS和Android之间的概念,设计,编程和生命周期完全不同。 两者在某些方面都赢得了比赛。 首先,我决定使用Swift 3编程语言在iOS中开发我的第一个hello world应用程序。 选择Swift的原因是Objective -C变得过时了,多年来,Swift将成为开发iOS应用程序的官方语言。 此外,如果您了解基于Typscript的JavaScript,那么使用Swift中的几个新概念即可轻松学习Swift。 在高级Swift,Typescript和Android上,Kotlin在语法上相似,并且有许多共同点。 让我们开始吧。 如果您想学习iOS应用开发,则需要Macbook(pro),8 GB RAM(安全)和XCODE 8+。 另外,您需要一个Apple开发人员帐户。 打开XCode,然后创建新项目并立即选择单视图应用程序。 接下来填写基本详细信息项目名称,等等。 创建成功后,IDE将打开,文件浏览器位于左侧。 实用程序面板在右侧,调试面板在底部。 在项目下的文件浏览器中,您会看到几个文件,这些文件是自动创建的,并且内部的骨架代码也是自动创建的。 Main.storyboard-将在此处设计每个屏幕的所有应用程序UI视图。 按钮,文本视图,文本区域等将移至此处。 在这里,您将链接所有UI组件以进行事件处理(我们将在本节的后面部分看到) ViewController.swift —此文件是故事板上您应用程序屏幕的关联文件,每个UI屏幕都可以与Viewcontroller文件关联。 UI组件所有事件处理的代码将在此处处理。 AppDelegate.swift-此swift文件具有适用于所有应用程序UI生命周期状态的处理程序方法。 这意味着AppDelegate的“关注区域”正在处理特殊的UIApplication状态。 有关生命周期的详细信息,请单击此处。 第1步-为您的应用创建UI 第一步是为您的应用创建UI。 对于我们的第一个hello应用程序,我们将具有标签,文本框和按钮。 单击按钮时,应使用文本框的内容更新标签。 简单不是吗。 点击main.storyboard, 从右下角的对象库中拖动标签对象,并将其放在故事板内部的视图中,如下所示。 然后从“实用程序”面板的“属性检查器”选项卡中更改标签值。 3.同样,将“文本框”和“按钮”添加到屏幕。 完成后,屏幕将如下所示。 您可以在实用程序面板的“属性检查器”选项卡中更改标签,颜色,大小和所有其他属性。 接下来是我们链接UI组件以进行事件处理。 我们应用程序的用例是使用标签添加到文本框输入的“ hello”文本来更新标签。 单击窗口右上角的助手编辑器按钮。 该按钮将如下所示。 这将打开故事板内部的viewcontroller.swift文件。 2.要链接UI组件以获取值和处理事件,在Swift和Xcode中,您只需将组件从情节提要板拖放到视图控制器即可。 比在android中要编写许多代码行更容易。 3.单击情节提要中的CTRL +文本输入,然后将其拖放到视图控制器文件中。 4.拖放后,它将打开一个小弹出窗口,您需要在其中选择此链接是从UI组件获取/更新值还是处理事件。 […]

基于Swift的建筑控件

(从2017年春季重新发布) 在2016年初,我们在PassiveLogic进行了一次有趣的实验,将一些C代码重构为Apple的新系统语言Swift。 这个实验项目证明是成功的,我们决定采取大胆的举动,用Swift重写我们的整个代码库。 为系统关键型启动采用一种新语言似乎是不寻常的举动。 这是一个经过仔细考虑的决定。 它表明,苛刻的现实是C和C ++的入门系统语言已接近中年。 在过去的几十年中,我们已经看到编程语言随着快速原型开发,Web和应用程序开发以及并行性和客户端-服务器体系结构日益复杂的需求而迅速发展。 相反,系统语言的发展非常缓慢。 这种保守性部分是其持久性的根源。 但是,极端保守主义不是技术行业或初创企业的业务。 在过去的十年中,周围的技术市场一直在寻求高级语言以提高开发速度和竞争优势。 代码成本 PassiveLogic在我们下一代控制平台的开发中越深入,越多的C和C ++像锚一样。 不仅仅是编码速度或程序员的满意……最终的决定对业务至关重要。 毕竟,初始编码实际上是受您的大脑而不是手指的速度的限制。 仅此一项就不是采取语言行动的理由。 我们的一名开发人员向我证明了这一点,他们远远超出了使用普通旧C语言编写的python程序员的能力-他是神话般的10X程序员,可以将其淘汰。 因此,语言效率很重要,但这不是最重要的因素。 实际上,语言选择中最重要的决定是业务决定。 因为编程的成本并没有随开发人员通常划定完成线的最初实现而结束,而是您认为:“我做到了”并达到最高五分。 不,代价是通过单元测试,调试,现场测试,查找生产中的所有极端情况以及下一个家伙今后几年必须承担的累积技术债务,与该代码建立长期关系。 即使您的初创公司渡过了死亡的尽头,也经常会看到公司因为产品陷入技术低迷而陷入困境。 它们在技术上可能会负债累累,以至于所有的工程资源都被浪费在寻找bug上,而不是为客户创造更多的价值。 我们都看到了它的发生。 为什么选择Swift 面临的挑战是如何使开发人员能够实现更大的业务目标? 输入Swift。 Swift是第一种真正解决市场空白的系统语言。 它的目标是成为编程三重奏: 高效的高级语言语法 固有的安全性 像C一样的低速C 前两个实际上是系统编程新手。 是的,随着时间的流逝,C ++确实一直在提高生产率,但是它并不能摆脱不良习惯,安全风险和不确定的行为。 仅以“ null”为例,根据分析,这会导致25%的软件错误。 在Swift中甚至不可能实现null陷阱。 如果添加诸如错误的类型转换,枚举不匹配,内存问题,不完整的案例陈述等之类的东西,那么……一家机器人公司发现,使用Swift甚至不可能发生40%的问题跟踪器中的错误。 有价值? 绝对。 但是效果可以成倍增加。 我看着一个年轻的程序员在C语言中为复杂的指针错误而苦苦挣扎了数周,试图确定他的单元测试。 那是大量的调试时间和脑力劳动,本来可以专注于富有成效的思维和周到的功能开发。 而且,由于C ++程序员的平均年龄只有40多岁,这一挑战变得更加严峻。 部分原因是语言的年龄,而聚会则是因为掌握该语言需要花费很长时间。 这为招聘年轻人才提出了入职挑战。 Swift并没有消除它,毕竟它是一种新语言,并且发展很快。 但是从结构上讲,它是一棵修剪整齐的树,与当前的计算机科学思维相一致,不仅与C系列非常相似,而且与现代脚本语言也没有太多相似之处……使它感到熟悉。 精明的开发人员寻找有趣的机会,例如学习先进的语言,这并没有什么坏处。 这些优势加上Apple的支持,在短短2年内将Swift推入了十大编程语言的前十名,其增长速度超过了历史上任何一种语言。 社区很重要。 […]

Swift编程语言:iOS开发的利与弊

iOS是世界上两个最受欢迎的开发平台之一,这就是为什么一些公司只为iPhone开发软件产品的原因。 在为iOS开发时,有时可能难以选择必要的技术堆栈。 您还需要确定是要跨平台开发还是要进行更简单的本机开发。 在语言方面,您可以使用较旧的Objective-C或最近出现的Swift。 由于Objective-C已经存在了一段时间,因此在本文中,我们将重点介绍Swift中的编程。 什么是Swift编程? Swift大约是在五年前推出的,从那时起,它得到了一家大公司的支持,它正在成为iOS上开发的主导技术。 它是一个开源工具,具有庞大的支持社区和各种各样的第三方工具。 这一切始于2014年,当时苹果公司的一位顶级工程师克里斯·拉特纳(Chris Lattner)只是为了娱乐而乱花钱。 在苹果公司的一些同事发现了这一点之后,他们非常兴奋地尝试了一下。 他最终将在2014年全球开发者大会上继续介绍这种新语言,并开始受到欢迎。 2019年最值得学习的编码语言–数据驱动的投资者 在我作为本科生的那几年,我跳过了许多晚间聚会,而不去学习Java,希望它有一天能帮助我取得成功…… www.datadriveninvestor.com 斯威夫特是一门好语言 Swift是一种非常好的语言,因为它不仅是流行的开源工具,而且非常安全,因为设计本身会鼓励开发人员一致地编写清晰易读的代码。 也许它的主要优势是速度。 实际上,在比较Swift和Objective-C时,确定Swift的速度是2.6倍,在与Python的激烈竞争中,Swift的速度是8倍。 实际上,目前,我们正在见证将主导软件开发的一项巨大技术。 有了Apple的支持,确实可以迅速提高信誉,并提高其知名度。 Swift编程的优点 除了使用Swift进行iOS应用开发带来的明显好处之外,还有一些其他优点: 更好的可伸缩性-Swift非常适合在产品中添加功能,也可以在开发团队中添加新成员。 由于该语言促进了简单性,因此您可以根据需要向团队中添加其他开发人员,并让他们开始工作,因为它具有很高的可读性。 互操作性—想象一下,您有一个使用Objective-C构建的大型项目。 可以使用相同的代码库对应用程序进行所有需要的更新,并且由于我们已经知道Swift的可伸缩性,因此如果需要,还可以添加一些功能。 完全的堆栈潜力-IBM一直在积极推动Swift在云中可用,这一决定显示出巨大的好处。 服务器端Swift可以与任何技术集成。 如果您同时使用Swift进行前端和后端开发,则可以更好地共享您的代码,从而使开发过程更快。 使用Swift的缺点 尽管到目前为止,关于Swift的一切说法都是积极的,但仍存在一些Swift编码方面的挑战: Swift是相对较新的-自从Swift最近爆发以来,注定会有一些成长的烦恼。 没有太多的工具或本机库,较旧的工具与新版本的Swift不再相关。 几乎不支持早期的iOS版本-您只能在iOS7和更高版本的应用程序中使用Swift。 也就是说,Swift不能用于在较旧版本的操作系统上运行的旧项目。 但是,目前约有5%的Apple设备运行iOS6或更早版本。 人才短缺—尽管Swift社区正在迅速发展,但它仍然比其他开源语言小得多。 实际上,根据Stack Overflow进行的一项调查,在接受调查的78,000名开发人员中,只有8%的人表示他们使用Swift。 我们希望本文对您决定在开发下一个应用程序时是否使用Swift编码语言很有帮助。 在苹果公司的支持下,随着时间的流逝,Swift肯定会变得越来越流行,并且消除路上的所有麻烦和颠簸。 Swift的创建恰恰是顾名思义:极快,高效和可扩展。

扩展那些本机类!

正如我在上一篇关于全局可用函数的文章中提到的那样,有时我们不需要编写一个函数。 我们可以扩展本机类以从中获取更多信息。 如果您不了解iOS Swift扩展,请在此处了解它们。 扩展的主要优势也许,至少对我而言是…… iOS扩展也可以扩展本机类 因此,如果您需要现有组件/元素的额外功能或扩展本机类的功能,则只需为其编写一个扩展。 它可以驻留在应用程序中存在的任何文件中。 声明扩展名后,您可以将它们用作所有扩展类的函数。 让我们从一些示例开始,以阐明我的观点。 假设我们需要带下划线的标签。 将此粘贴到您的代码中的任何位置。 现在,我们的UILabel类具有一个名为下划线的新功能,可在整个应用程序中使用。 假设我们有一个类似下面的标签, 我们可以通过添加以下行来使用下划线类, label.underline() 扩展了UIKit的基本UILabel类后,我们的下划线功能可用于UILabel类或UILabel扩展的每个组件! 所以我们的实现看起来像这样, 这是一个非常基本的例子。 但是它也可能非常非常强大! 让我们看另一个例子,一个更原始的格式化方式,但仍然是必需的。 每当需要大量显示时,都需要用逗号格式化整数。 如果我们要在项目中以逗号格式格式化任何整数,则可以添加一个扩展本机Int类的附加函数,如下所示: 现在,我们可以像下面在代码中所需要的任何地方那样利用它。 让量= 1000000000 打印(“逗号格式:\(amount.withCommas())”) //返回“逗号格式:1,000,000,000” 那不方便吗? 现在,如果是货币金额怎么办? iOS专用于此用例的格式化程序。 我们可以将NumberFormatter类和扩展名一起使用,以在全局范围内使用此格式化程序,就像我们编写扩展Int类的逗号分隔符功能一样。 让我们定义另一个扩展,但是为此,我们将扩展Double类,因为无论如何货币最有可能是double类型! 现在,就像下面和中提琴一样使用它! print(amountDbl.currencyString()??“”) //返回“ $ 1,000,000,000.00” 当然,您可以覆盖语言环境以获得其他格式的货币。 为此,我们将不得不稍微重写一下我们的函数。 首先,我们需要将语言环境字符串作为函数参数。 我们将改变这一点, formatter.locale = Locale.current 进入这个 formatter.locale =语言环境(标识符:someString) 在这里,占位符someString将替换为我之前告诉您的区域设置字符串参数。 因此,我们更改后的功能现在应该看起来像这样, 现在,如果我们使用它,它将以您指定的语言环境返回格式化的数量字符串。 print(amountDbl.currencyString(locale:“ en_IN”)??“”) //返回“₹1,00,00,00,000.00” print(amountDbl.currencyString(locale:“ […]

Swift 4 Introduction系列1.3 — Swift基本数据类型

Swift鼓励程序员使用4种基本数据类型。 它们是String,Int,Double和Bool 。 字符串用于文本,整数用于整数, 双 精度型用于浮点数, 布尔型用于存储布尔值(真或假)。 除了4种基本数据类型外,我们还可以使用UInt表示的无符号整数和Float表示的较小浮点数 。 对于有符号和无符号整数,都可以将它们分解为位大小的整数。 一个八位带符号整数由Int8表示。 对于有符号整数,我们有Int8 , Int16 , Int32和Int64 。 同样,对于无符号整数,我们也有UInt8 , UInt16 , UInt32和UInt64 。 整数,浮点数和布尔值的实现与许多其他C类编程语言(例如C,C#或Objective-C)非常相似。 使用不同的编程语言,String的实现将有所不同。 在本文中,我们将介绍String的基础知识。 在本文中,我们还将介绍与其他编程语言不太相同的新数据类型。 元组是包含一组值的数据类型。 可以使用其他基本数据类型的组合来构造这些值。 我们可以将多个值组合成一个元组,并像处理单个变量一样传递多个值。 (提示:对于C编程,元组类似于struct)。 Swift还引入了一种称为Optionals数据类型的数据类型。 可选变量处理变量中没有值的情况。 它类似于Objective-C中的nil指针,但可选选项适用于所有Swift数据类型。 可选参数比Objective-C中的nil指针安全。 通过使用if语句和可选变量,Swift引入了一种称为可选绑定的编程技术,该技术可对所有变量进行安全检查。 可选绑定是Swift编程的关键功能之一。 整数 在Swift中, 整数是整数 。 整数数据类型仅接受整数。 例如,整数接受数字,例如54或57791。 整数可以进一步分为有符号整数和无符号整数 。 有符号整数接受负整数和正整数。 有符号整数的示例是57,-325和-54623。 无符号整数仅接受正整数,例如723和9394。 有符号整数用Int表示,无符号整数用UInt表示。 另外,Swift还提供位大小的整数。 UInt8表示大小为8位的无符号整数。 Swift提供了4个无符号位整数,它们是UInt8 , UInt16 , […]

Swift 4.2的新功能

苹果已经发布了Swift 4.2,这似乎是明年推出Swift 5的第一步。 现在,我们将看到Swift 4.2中的一些改进,这些改进可能会在我们的项目中派上用场。 随机数: 在Swift 4.2之前: 让randomNumber = arc4random_uniform(50) 上面的代码生成UInt32类型的1到50的随机数。 在Swift 4.2中: 让randomNumber = Int.random(in:1 .. <50) 上面的代码在这里生成1到50之间的Int类型的数字。 上面的方法适用于类似的数据类型,例如Float,Double,CGFloat等。如果要生成随机布尔值,则可以使用Bool.random()轻松完成。 上面的另一个补充是我们还可以从像 让汽车= [“福特”,“丰田”,“大众”,“奔驰”] print(cars.randomElement())//从上面的cars数组中打印任何一个。 改组: 改组属性可能会在您像纸牌游戏那样在某处随机生成排列的地方派上用场。 var卡= [“杰克”,“国王”,“女王”] cards.shuffle()//将对数组元素进行重新排序 或let cards = cards.shuffled()//将重新排序的数组分配回cards变量 序列命名的改进: 在Swift 4.2之前: let array = [“苹果”,“芒果”,“橙色”] 如果让appleFruit = array.index(其中:{$ 0 ==“苹果”)}),{ 打印(“发现苹果”) }其他{ 打印(“找不到苹果”) } 上面的代码获取数组中第一个元素的索引,该索引等于“ apple” 快速4.2 如果让firstFruit = […]

UITableView中有多个UITableViewCells

本教程的重点是如何以尽可能少的代码正确地在UITableView中添加多个UITableViewCells。 在本教程中,我选择了一个场景,其中您的应用程序包含诸如联系我们,注册,登录等屏幕。简单地说,您需要在具有多种单元格类型的多个屏幕上显示表单。 当然,您可以将其应用于在UITableView中需要多个UITableViewCells的任何其他方案。 在开始之前,您需要了解几件事: 扩展名 枚举 关闭 自动版式 为了更好地理解,我创建了一个示例GitHub项目,您可以在此处下载。 创建UITableViewCells 首先,我们将从UITableViewCells创建开始。 如果打开项目,将在文件夹Cells下看到创建的各种单元格 ,这些单元格包含输入字段,下拉列表,操作按钮,多行输入字段。 出于演示目的,我将使用BaseCell和InputCell 。 我们将首先创建一个主单元(名为BaseCell),该单元将处理所有子级任务。 BaseCell用于存储所有子元素中相互共有的功能。 然后,我们将这些功能用作子单元格中的替代。 此单元格没有UI,但将从其子级中获取合适的UI。 基本单元 import UIKit class BaseCell: UITableViewCell { //MARK: Internal Properties var type: CellType! var pickerOptions: [String]!{ didSet{ pickerOptionsSet() } } var textChangedBlock: ((String) -> Void)? override func awakeFromNib() { super.awakeFromNib() // Initialization code } func setForm(title: […]