Tag: swift

Swift Ruby Python用JavaScript编写

学习新语言的技巧 有一个鲜为人知的秘密,我们在民间/流行弦乐器世界中很少披露。 我们经常对人们说:“哦,您在寻找低音吉他手吗? 好吧,我只弹吉他,所以很抱歉,我无法为您提供帮助。”,因为这是一种摆脱演出的简便方法,因为演出收费不菲甚至根本没有。 这是一个谎言,但是我们大部分时间都不会这样做,因为询问的人通常对此并不了解,因此我们不必处理任何不必要的反弹。 但事实是,大多数音乐家可以而且确实可以演奏一种以上的乐器。 尽管有时这个模因很荒谬,但这确实是我在学习JavaScript和Ruby之后完成了Swift入门在线课程(在此处找到)时的感受。 老实说,我期望我以前从未见过的东西,并且一开始会相对丢失(通常是我的默认设置)。 男孩,当我发现自己错了时,我很兴奋。 该课程以所有语言课程的入门材料开始。 我在声明变量,编写字符串,学习数据类型以及每种编程语言的所有基础知识。 我没想到这里会有太多差异,因为您可以在此材料上进行的变化非常有限。 然后,我开始编写函数。 我不得不编写一个看起来像这样的问候函数: func sayHello(name:String){ print(“你好,\(名称)!”) } sayHello(名称: 名称) 看着它,我开始注意到一些相似之处。 我仅在这三行代码中就可以看到Ruby和JavaScript的并行性。 他们是: func sayHello(){}-> JavaScript函数语法 sayHello-> 像JavaScript一样的Camel Casing print()-> 也在Ruby中找到 sayHello(name: name)->调用JavaScript或Ruby之类的函数 对我来说,这是一个真正的突破性时刻。 我不再觉得自己是从第一个方格开始,而必须在初学者阶段逐步进行。 相反,我开始觉得自己处在某种加速的轨道上。 当我将该功能的所有内容分解为最小的部分时,我意识到唯一的区别是: func vs function-> 与JavaScript略有不同 (名称:字符串)-> 不同的参数语法 print(“ Hello,\(name)!”)->不同的插值语法 本质上,我只需要学习三件事就可以在Swift中编写基本功能。 谈论能够迅速起步! 我不但不发汗,反而乐于运用我以前的知识。 我感觉: 保持差异有序: 这是我遇到的最大困难,特别是在编写全栈应用程序或执行各种不同的代码挑战时。 尽管相似之处使学习语言更加容易,但有时,微小的差异被证明是主要障碍。 例如,在Ruby和Python中编写if语句之间的区别是: 红宝石: 如果arg […]

老派的Objective-C与新星Swift

时钟在滴答滴答,技术不止于此。 我们每天都面临着各种变化,包括编程语言的发展。 在创建Swift之前,Objective-C是IOS开发人员的唯一选择。 但是,随着时间的流逝,开发人员开始抱怨这种语言已成为过去的一种现象。 他们告诉我们,Objective-C是按照现代标准的老式,坦率的丑陋和不便的语言。 当然,每种著名的编程语言都有讨厌者和支持者。 开发人员应有充分的理由拒绝某些编程语言并开始学习新的编程语言。 IT行业的历史知道很多情况,当时间引起确定的变化并导致过渡时。 Swift是新的编程明星 如果您对iOS应用程序的创建感兴趣,则会出现一个问题-选择哪种编程语言:新的Swift或经过时间考验的Objective-C? Swift被定位为一种简单明了的语言。 Objective-C需要相当高的知识和技能。 因此,努力一次完成所有工作的新手开发人员将面临许多困难。 苹果对Swift寄予厚望。 由于具有多个关键功能,因此多年以来,Swift有潜力成为创建灵活软件的唯一首选编程语言。 Swift比Objective-C的优势: Swift比Objective-C的可读性更好。 Objective-C遇到了用C系列语言带来的所有麻烦。 为了区分关键字和C数据类型的类型,Objective-C使用@符号引入了新关键字。 由于Swift不是基于C的,因此它可以组合所有关键字并删除每个Objective-C类型之前或与对象关联的关键字之前的众多字符@。 因此,您无需在行末添加逗号或在括号中添加括号以将条件表达式括在if / else语句中。 另一个大变化是方法调用不位于彼此内部。 在Swift中,方法和函数通过括号中的标准逗号分隔参数列表进行调用。 结果,我们获得了具有简化语法和语法的纯净表达语言。 与Objective-C不同,Swift代码的可读性促进了JavaScript,Java,Python,C#,C ++开发人员的工作。 Swift更安全 指针处理方法是Objective-C中最有趣的时刻之一,尤其是nil(NULL)。 在Objective-C中,如果您尝试使用nil指针(未初始化)变量来调用方法,那么一切都会好起来的。 表达式或代码行变得不可能。 即使有欺骗性的表现,您也会遇到很多错误。 可选类型可以使nil代码中存在可选值。 如果开发人员不好地编写代码,则会出现编译器错误。 这是一种简短的反馈,它使开发人员可以更加自信地编写代码。 Swift需要更少的代码 Swift减少了重复语句和行所需的代码量。 在Objective-C中使用文本字符串时,您必须要罗word。 对于两个信息的组合,您应该通过许多步骤。 在Objective-C中,如果您违反了头寸订单或使用了错误的行标记,则应用程序将崩溃。 同时,Swift减轻了您的工作量:由于内置了对文本字符串和数据处理的支持,因此您可以编写更少的代码(因此,错误更少)。 雨燕更快 由于删除了过时的约定,Swift的引擎变得更好。 对Swift代码性能的测试仍然表明Apple继续提高Swift上应用程序的速度。 根据Primate Labs的说法,GEMM算法表明,Swift编译器无法像C ++编译器那样对代码进行矢量化。 C ++的优势不大,但是Apple承诺会在下一个Swift版本中修复所有问题区域。 Swift具有动态库 动态库是可以附加到应用程序的可执行代码段。 由于其不断发展,该功能允许当前的Swift应用程序联系较新的语言版本。 动态的Swift库使更改和改进变得更加容易和快捷。 现在,人们无需等待IOS发行就可以获得Apple向Swift引入的改进。 […]

什么是@testable?

在编写代码时,我们根据类和方法的使用情况定义它们的访问级别。 在编写测试时,我们必须在测试目标中访问这些类和方法。 如果我们未指定显式访问级别,则代码中几乎所有实体都具有默认的内部访问级别。 结果,在许多情况下,我们不需要在代码中指定显式访问级别。 swift的访问控制模型可防止外部实体访问在应用程序或框架中声明为内部的任何内容。 默认情况下,为了能够从我们的测试代码访问这些项目,我们需要将它们的访问级别至少提高到公共级别,从而降低快速类型安全的好处。 解: 1.启用“可测试性”构建设置为“是”。 Xcode在编译过程中包含-enable-testing标志。 这使得在编译模块中声明的快速实体有资格获得更高级别的访问权限。 2.当我们将@testable属性添加到已启用测试的模块的import语句中时,我们将在该范围内激活该模块的提升的访问权限。 标记为“公开”的班级和班级成员的行为就像标记为“公开”一样。 其他标记为内部实体的实体就像被宣布为公共实体一样。 注意: 我们无论如何都不会更改源代码。 我们仅修改编译(通过设置标志)。 和测试代码(通过修改import语句)。 @testable仅提供对内部函数的访问; 使用可测试时,fileprivate和private声明在其通常范围之外不可见。 感谢您的阅读 🎾

iOS中的图像裁剪视图– Bassel Ezzeddine

在本教程中,我们将逐步在iOS中创建图像裁剪视图。 这是最后的样子: 首先,创建一个带有情节提要的空Xcode项目: 然后将具有自动布局约束的UIScrollView和裁剪按钮添加到情节提要中,如下所示: 之后,将UIImageView添加到具有自动布局约束的scrollview中,如下所示: 这将使我们能够放大和缩小图像,在接下来的步骤中将用于裁剪图像。 我们添加的约束对于图像视图填充滚动视图的所有内容很重要。 另外,我们应该将imageview的内容模式设置为AspectFit,这样我们的图像就不会被拉伸或变形。 接下来,拖动一个UIView并将其添加到具有自动布局约束的scrollview内,如下所示: 该视图将成为我们的作物视图。 在此非常重要的是,我们相对于主视图而不是相对于滚动视图或图像视图设置此裁剪视图的约束(后移,前导和居中Y)。 原因是使我们的裁剪视图始终固定在屏幕中间,同时缩放和移动其后面的图像。 现在,将scrollview,imageview和crop视图的出口连接到ViewController类和一些属性,如下所示: 我们设置滚动视图的最小和最大缩放比例属性,以限制放大和缩小。 此外,我们设置了裁剪视图的一些图层属性以配置其外观。 我们还应该通过返回其imageView实现其方法viewForZooming来实现UIScrollViewDelegate的要求,该方法是需要具有缩放功能的视图: 运行应用程序,它应该看起来像这样: 您应该能够放大和缩小,并将裁切视图放置在图像上的任何位置。 现在,我们需要使用“ cropImage”方法创建一个名为ImageCropHandler的新结构,该结构将根据定义的裁剪区域来裁剪UIImage: 该方法的代码直接从CGImage裁剪方法的Apple开发人员文档中复制: https://developer.apple.com/documentation/coregraphics/cgimage/1454683-cropping 运作方式如下: 首先,我们计算输入图像的尺寸相对于imageView尺寸的比例(处理大于imageView的图像是必需的)。 然后,我们使用此比例来调整输入裁剪矩形的大小。 之后,我们使用此裁剪矩形作为参数调用CGImage的裁剪方法,然后得到其输出,即裁剪后的图像。 最后,我们将生成的裁剪后的CGImage投射到UIImage中,然后将其返回。 现在,我们创建裁剪按钮的IBAction方法,该方法将执行图像裁剪算法。 我们之前创建的cropImage方法采用四个参数: inputImage:由我们的imageView显示的图像 cropRect:代表我们作物面积的矩形,其位置应相对于所显示的图像 imageViewWidth:我们的imageView的宽度 imageViewHeight:我们的imageView的高度 除了需要计算的cropRect以外,所有这些参数都准备好传递。 我们已经有了cropRect的宽度和高度,这与我们的crop视图的宽度和高度完全相同。 但是,cropRect的X和Y与我们的作物视图的X和Y不相等,因为它们应针对imageView内部的图像进行计算。 查看如何使用下图计算它们: 如此简单: X(cropRect)= X(CropView)– X(图像) Y(cropRect)= Y(作物视图)– Y(图像) 但是,为什么我们针对图像的位置而不是imageView进行计算呢? 原因是因为我们使用的是imageView的AspectFit属性,所以图像位置可能与imageView的位置不同(如果图像没有像本项目中的个人资料照片那样充满所有imageView,那么我们需要一种方法来获取scrollView中的实际图像位置。 我创建了一个UIImageView帮助器方法,该方法可为我们计算实际拟合图像的矩形,并包含我们需要的位置: 现在回到我们的ViewController中的裁剪IBAction,是时候进行裁剪了: 我们创建cropRect,将其传递给cropImage,在imageView上显示最终的裁剪图像,然后最终缩小到默认缩放比例: 完成了! 感谢您的阅读,希望您喜欢本教程🙂 您可以在GitHub上找到完整的代码: https://github.com/BasselEzzeddine/PhotoCrop

检测系统或交易记录的异常活动[SWIFT CSP 7/8]

这篇文章是一个由八部分组成的系列文章的第七部分,该系列文章帮助企业领导人寻求确保其团队已正确遵守新控制制度的保证。 在这篇文章中,我们正在研究第六个原理:检测系统或交易记录的异常活动。 这适用于具有本地SWIFT实施的用户和使用局服务的用户,以保护系统免受恶意软件感染并记录系统生成的重要安全事件。 有什么风险? 使用防病毒软件可以保护您的计算机免受恶意代码的侵害,并在尝试感染计算机时通知您。 记录安全事件可确保您及时发现并响应异常或可疑活动,并减少未经授权的访问(如资金损失)的影响。 在银行金库中,这类似于让CCTV监视和记录进出,操作员可以识别是否有人在正常工作时间之外访问金库。 控制目标: 有两种适用于所有SWIFT成员的强制性控件:恶意软件保护以及日志记录和监视。 确保保护SWIFT基础架构免受恶意软件的侵害,降低了操作员PC或与SWIFT相关的服务器可能被恶意代码破坏的可能性。 如果攻击者尝试使用恶意软件来获取或维护未经授权的服务器访问,则这将降低攻击者成功的可能性。 恶意软件检测技术也是一种有用的传感器,可以将日志从日志中传回日志和监视系统,以便可以将重要的通知或可疑活动提请员工注意。 监视付款基础结构上的活动和安全事件可提供一种重要的方法来识别您是否受到攻击。 及早发现异常行为意味着您可以动员响应团队并阻止攻击,从而大大减少其影响。 如果您拥有自己的本地SWIFT网关,则可以应用另外两个强制性控件,这两个控件都与软件和数据库记录的完整性有关。 在攻击成功的地方,他们操纵了SWIFT服务器上运行的软件,并更改了数据库记录以掩盖其踪迹。 监视系统和数据库是否处于预期状态可提供另一个有价值的数据点,以识别您是否受到攻击。 要问的问题: 在寻求确保他们已履行此控制的义务时,高级管理人员应考虑以下问题,以使他们对证明和降低风险有信心: 我们的SWIFT环境中部署了什么反恶意软件解决方案? 反恶意软件软件已安装在您的安全区域中的Operator PC和与SWIFT相关的服务器上。 解决方案应来自信誉良好的供应商。 应将其配置为在高峰时间/营业时间之外每两周执行一次“按需访问”扫描(也称为“实时”或“后台扫描”)以及计划的全面扫描。 我们是否可以检测反恶意软件签名是否未更新? 有关已知恶意软件的配置文件或信息库应定期由反恶意软件进行更新,以确保其有效。 如果无法更新,则应由IT或安全团队加以识别和补救。 我们需要什么功能来监视安全事件并检测SWIFT基础架构中的异常行为? 监视功能(例如,安全运营中心)应该正在从SWIFT基础结构接收安全和事件日志。 这必须包括检测网络上异常行为的能力,例如可疑登录管理员帐户。 日志应尽可能允许将事件标识回单个用户。 我们将日志存储多长时间? SWIFT消息传递和通信应用程序审核日志至少保留12个月。 操作员PC,防火墙和数据库审核日志至少保留31天。 两者都应保留在安全的位置,SWIFT基础结构的管理员无法在此位置修改或删除信息。 当地法律法规可能会取代这些要求。 以下问题仅在具有本地本地SWIFT网关的情况下适用。 我们多久检查一次SWIFT安全区内的软件配置和完整性? 在启动时每天至少验证一次软件和配置的完整性,方法是验证文件的校验和是否与预期状态相符。 在我们的SWIFT消息传递数据库上启用了哪些数据库完整性检查? 记录级完整性检查应通过验证记录的校验和或签名来进行。 还应检查以确认交易编号顺序中没有空格,这可能表明交易已被删除。 结论 通常,为了成功地按照此原则成功实施控件,您的团队将确保由安全运营中心(SOC)监视提供SWIFT服务的服务器和工作站。 此SOC的范围将从SWIFT安全区域中的服务器和安全设备以及操作员PC中获取事件日志。 SOC将了解要破坏您的SWIFT支付系统的特定“危害指标”和攻击者的作案手法。 他们将确认反恶意软件解决方案已部署并保持最新状态,并且在失败的情况下,可以使用适当的过程来识别和修复失败。 如果您有本地解决方案,则将部署或配置其他软件解决方案,以检测服务器和数据库的预期状态的更改。 这样,您的团队将使您更有可能检测到网络上的异常活动,并有时间进行干预并防止对组织造成重大影响。 在本系列的下一篇博客文章中,我们将研究如何计划和响应SWIFT基础架构上的网络事件。 您还可以查看本系列的其余文章。 请记住跟随并联系,以便您得到通知,同时,如果您有任何疑问,请随时发表评论,或给我发消息以获取更多信息。

基于协议的通用网络-第2部分JSONEncoder和Swift中的Post请求可编码。

自从我在那篇文章中写了“在Swift 4中使用JSONDecoder和Decodable的基于协议的通用网络”以来,我一直在谈论如何使用Decodable,协议和泛型来创建可重用的网络层。 效果很好,但API仅限于GET HTTP方法,这就是为什么在本教程中我想将其扩展为使用POST方法,我将尽力向您展示如何使用枚举来完成这项工作,我假设您没有读过第1部分,因此在新项目中我将从零开始,您可以随时返回第一部分以了解更多详细信息。 我们将从GenericAPI类开始,创建一个新文件并复制并粘贴… 协议GenericAPIClient {var session:URLSession {get} func fetch (带有请求:URLRequest,解码:@escaping(Decodable)-> T ?,完成:@escaping(Result )-> Void )}扩展名GenericAPIClient {typealias JSONTaskCompletionHandler =(Decodable ?, APIError?)->无效的私有函数解码任务(带有请求:URLRequest,decodeType:T.Type,completionHandler的完成:@转义JSONTaskCompletionHandler)-> URLSessionDataTask {let任务= session.dataTask(with:request){数据,响应,防护错误让httpResponse =响应为? HTTPURLResponse否则{completion(nil,.requestFailed(description:error?.localizedDescription ??“无描述”))return} guard httpResponse.statusCode == 200 else {完成情况(nil,.responseUnsuccessful(description:“ \(http(Response.statusCode )“))return}保护let data = data else {complete(nil,.invalidData); return} do {letgenericModel = try JSONDecoder()。decode(decodingType,from:data)complete(genericModel,nil)}捕获let err { }} return task} ///成功响应在主线程上执行。 func fetch […]

Tentang Button和IBAction,juga Label和IBOutlet

晕semua! Yuk mari kita lanjutkan教程iOS应用程序开发教程。 Tutorial kali ini akan membahas beberapa hal yaitu: Komponen标签(sebetulnya sudah kita kenal di tutorial sebelumnya) Komponen Button Apa dan bagaimana视图控制器itu Sekelumit tentang IBAction,丹 Sekelumit tentang IBOutlet 查看布局 商业逻辑 Tentang View-Controller Membuat Button的IBAction Membuat Label的IBOutlet Ngoding业务逻辑! Buka Xcode,lalu buat项目iOS / Swift baru。 卢帕/贝鲁·塔胡·卡兰尼亚? Simak教程cara membuat iOS App应用程序Anda disini。 挑战! Cari komponen […]

快速提示:属性配置

如果您从事iOS开发已有一段时间,那么您会遇到大型的init和viewDidLoad()方法,如下所示: 类MyViewController:UIViewController { var collectionView:UICollectionView? 覆盖func viewDidLoad(){ super.viewDidLoad() 让layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizo​​ntal collectionView = UICollectionView(frame:.zero, collectionViewLayout:布局) collectionView? .translatesAutoresizingMaskIntoConstraints = false collectionView?.isPagingEnabled = true collectionView?.backgroundColor = .clear collectionView?.showsHorizo​​ntalScrollIndicator = false view.addSubview(collectionView!) //自动版式代码… } } 由于Swift能够配置闭包内联的属性,因此我们可以做得更好。 类MyViewController:UIViewController { 让collectionView:UICollectionView = { 让flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .horizo​​ntal 让collectionView = UICollectionView( 帧:.zero, collectionViewLayout:flowLayout ) collectionView.translatesAutoresizingMaskIntoConstraints = […]

构建Foursquare克隆iOS应用-第3部分:持续集成

第1部分:简介和设置 第2部分:位置数据和管理依赖项 第三部分:持续集成 第4部分:流媒体位置 第5部分:网络层 第六部分:国家管理 我们将在项目中使用持续集成(CI),通过每次推送到存储库的提交自动检查应用程序的质量。 CI还可以用于自动构建应用程序并将其部署到App Store,但这不在此介绍。 您可以随时查看Github存储库以供参考。 Travis最初将负责克隆最新的存储库提交,安装其依赖项,然后将尝试构建和运行我们在上一篇文章中编写的测试。 运行CI脚本后,如果构建或测试失败,它将把您的提交/ PR标记为无效。 我选择Travis CI作为CI平台是因为我过去有一些经验。 它在开源社区中得到了很好的采用,因此它也得到了StackOverflow的良好支持。 开始使用Travis 首先,使用您的Github帐户登录TravisCI页面,并在配置文件页面中轻按开关以添加存储库。 Travis已经在听您的提交了。 然后,您需要在每次推送提交时指示Travis您想要什么。 这些说明在您需要在存储库的根文件夹中创建的.travis.yml配置文件中传递。 这是我们项目最初的文件外观: 上面的状态表示我们的应用程序已成功编译,但是使用TravisCI可以实现更多目标。 在下一步中,我们将使用TravisCI的另一个免费工具来显示我们应用程序测试的代码覆盖率。 Codecov是用于集中存储库的代码覆盖历史记录的工具。 在运行上一篇文章中描述的测试之后,将Travis配置为将代码覆盖率报告上载到Codecov。 要启用此功能,首先您需要配置Xcode项目以生成coverage数据,以便稍后上传:选择方案并点击“ Edit Scheme …”,选择“ Test”并启用“ Gather coverage data”。 要在您的存储库中启用Codecov,请首先使用您的Github帐户注册,然后在此处添加您的存储库。 完成此操作后,您就可以通过配置travis.yml开始上传覆盖率数据: 危险是另一个在代码检查期间强制执行约定的CI工具。 在这个项目中,我们将使用默认配置以及SwiftLint验证。 要使其正常工作,您基本上需要: 在项目的根目录中添加.swiftlint.yml文件,以排除外部依赖项。 在此文件中,您还可以添加自定义棉绒规则: 将个人令牌添加到存储库的TravisCI设置页面上的DANGER_GITHUB_API_TOKEN环境变量中: 指示TravisCI使用bundle exec danger运行Danger: 在CI工具上设置存储库肯定需要花费一些时间,但是,如果您的项目具有一定的复杂性,那是值得的,因为它可以节省代码检查时间并避免错误。 在项目开始时,您可能还需要为每个应用程序执行一次操作。 通过自动执行本文中描述的无聊的重复任务,您还将改善开发人员的体验。 下一部分:流媒体位置

Swift的情节提要标识符

iOS / macOS开发人员有两种:拥抱故事板的人和鄙视故事板的人。 我是前者,但我一直很讨厌为单元格,视图控制器或segue标识符等使用硬编码的字符串。 因此,我编写了一个脚本,用于分析故事板文件并生成带有所有标识符的Swift文件,以便在代码中更轻松地使用它。 您可以在这里找到代码:https://github.com/unsplash/swift-storyboard-identifiers 生成的.swift文件如下所示: 您可以使用如下标识符: performSegue(withIdentifier: SegueIdentifier.viewItem, sender: sender) 以及类似的情节提要扩展: UIStoryboard.template.instantiateInitialViewController() 而已! 谢谢阅读。