Tag: swift

Github的Swift.gitignore解释

Swift.gitignore里面是什么? 在创建Xcode项目时,您放置了一个.gitignore,因为您不希望不必要的干扰出现在提交中。 但是,您不知道要在.gitignore中放入什么内容,因此只需从Github中获取Swift.gitignore,而无需真正了解文件中的每一行意味着什么。 我在做同样的事情,但想了解Xcode中的git,并有信心在Xcode项目中使用git。 github / gitignore 有用的.gitignore模板的集合github.com #Xcode # #gitignore贡献者:记得更新Global / Xcode.gitignore,Objective-C.gitignore和Swift.gitignore ##构建生成 建立/ 衍生数据/ ##各种设置 * .pbxuser !default.pbxuser * .mode1v3 !default.mode1v3 * .mode2v3 !default.mode2v3 * .perspectivev3 !default.perspectivev3 xcuserdata / ##其他 *。移开 * .xcuserstate ## Obj-C / Swift特定 * .hmap * .ipa * .dSYM.zip * .dSYM ##游乐场 timeline.xc时间线 Playground.xcworkspace #Swift软件包管理器 # #如果您要​​避免从Swift Package Manager依赖项中检入源代码,请添加此行。 […]

在Swift-3.0中使用协议……

为什么在Swift中需要协议 ? * Act作为接口 * S规定了一组应实施的行为 *您的班级可以遵守的合同合约 *要求|| 方法要求|| 初始化要求 *被选为代表 *用作类型 如何声明协议? 属性要求是什么意思? *协议conformingType必须提供实例|| 具有特定类型&& name的Type属性。 *这里没有约束,必须存储属性|| 计算类型 * C an指定获取|| 设置属性或同时设置两者。 类型属性: 静态关键字为必填项 方法要求是什么意思? *具体的实例方法和类型方法要通过一致性类型来实现。 变异方法要求 更改方法允许更改该实例的属性值。 初始化程序要求: 注意 :初始化器可以是失败的初始化器 如何将协议用作类型? 协议对委派 有何帮助? 代表团 ? :启用结构||的设计模式 班级分担另一个实例的责任。 协议继承: 协议组成 如何仅在类中限制协议? 可选协议要求

蒸气3入门

Vapor是iOS社区中领先的服务器端Swift框架,它使Swift开发人员可以将其现有的Swift技能带到云中。 在蒸气1和蒸气2成功之后,蒸气团队通过创建蒸气3框架使它变得更好。 在撰写本文时,Vapor 3尚未发布,但足够稳定,可以在应用程序中使用。 在这篇文章中,我将介绍如何开始使用Vapor 3。 安装蒸气3 Vapor文档提供了有关如何安装Vapor 3框架的详细说明。 我不再重复安装过程,而是直接链接到此处的过程。 你好蒸气 安装Vapor后,下一步是初始化Vapor项目。 可以在终端中通过运行以下命令来完成此操作。 蒸气新的你好蒸气 这将创建一个新的“ hello-vapor”项目文件夹,其中包含使用Vapor入门的所有默认文件。 跳到hello-vapor文件夹并运行以下命令。 蒸气Xcode 该命令将为您的Vapor项目创建一个Xcode项目。 该过程完成后,您将为hello-vapor项目获得一个xcodeproj文件。 现在,您只需双击Xcode项目文件即可在Xcode中打开Vapor项目。 在构建应用程序之前,请确保将目标设置为“运行”,并选择“ 我的Mac”作为设备,如以下屏幕截图所示: 构建完成后,运行您的应用程序。 这将在端口8080上启动服务器。在浏览器中访问http:// localhost:8080 / hello,查看正在渲染的hello路由。 恭喜你! 您现在正在使用Vapor框架在服务器上运行Swift。 路由 默认情况下,Vapor在routes.swift文件中添加一些锅炉级别的代码,该代码为您的Vapor项目创建默认路由。 您可以在routes.swift文件中创建自己的路线。 让我们为电影添加一条路线,如下所示: 您甚至可以将不同的路线嵌套在一起,如下所示: 您可以使用“路由参数”的功能,而不是为每种可能的流派创建路由,如下所示: 借助蒸气参数,我们不必为每种类型创建单独的路线。 Vapor还提供了一种简单的方法来访问查询字符串,分组路由等等。我在我的课程“ 使用Vapor 3掌握服务器端Swift ”中对此进行了详细讨论。 您可以使用下面的优惠券代码获得该课程的折扣。 希望您喜欢这篇文章! 编码愉快! 使用Vapor 3掌握服务器端Swift 乌迪米 您是否有兴趣学习如何使用Swift编写完整的后端API? 服务器上的Swift是…的未来。 www.udemy.com

如何在Swift中实现多个Collection视图

在我的Swift旅程中,我一直在寻找一种简单的方法来将2个或更多集合视图实现到一个UIView中。 为了在numberOfItemsInSection和cellForItemAt方法中引用这两个视图,需要在单独的“帮助”文件中进行设置,如下所示: 导入UIKitclass collectionViews { 静态函数collectionViewOne()-> UICollectionView {让布局= UICollectionViewFlowLayout()让collectionViewOne = UICollectionView(frame:CGRect(x:0,y:20,width:200,height:100),collectionViewLayout:layout)return collectionViewOne} 静态函数collectionViewTwo()-> UICollectionView {let layout = UICollectionViewFlowLayout()let collectionViewTwo = UICollectionView(frame:CGRect(x:0,y:300,width:200,height:100),collectionViewLayout:layout)返回collectionViewTwo} }类标签{静态函数labelArray()-> [UILabel] {让labelA = UILabel(frame:CGRect(x:0,y:0,width:100,height:50))labelA.text =“我是“ let labelB = UILabel(frame:CGRect(x:0,y:0,width:100,height:50))labelB.text =” i’m b“ let myArray = [labelA,labelB]返回myArray}} 这是主View Controller文件的代码: 导入UIKit类ViewController:UIViewController,UICollectionViewDataSource,UICollectionViewDelegate {让collectionViewOne = collectionViews.collectionViewOne()让collectionViewTwo = collectionViews.collectionViewTwo()var myArray:[UILabel] = labels.labelsArray()var myArray2:[UILabel] = labels.labelsArray()覆盖func viewDidLoad(){super.viewDidLoad() collectionViewOne.delegate =自己collectionViewOne.dataSource […]

我们希望得到的东西是Swift,第1部分

Swift编程语言是一种特殊的东西。 它是最直观,最令人沮丧的语言之一,并且由于苹果建立了庞大的社区,它每年以无数令人敬畏的功能增长。 与Objective-C相比,在Swift中完成许多工作变得更快,更干净! 在DSW,我们使用Swift write 100%编写我们的iOS软件。 我们甚至正在探索使用Vapor之类的工具来编写服务器端Swift(更多内容将在后面介绍)。 但是像许多开发人员一样,我们偶尔会发现自己在Swift的内置类型上构建了有用的扩展,我们希望这些内置类型可以直接使用。 在某些情况下,这些辅助方法最终会在我们的整个代码库中使用,并成为我们体系结构的关键 。 在本文中,我将分享一些我们最常用的辅助方法,以及为什么我们喜欢使用它们。 这些方法在共享框架中定义,并由我们所有的iOS应用程序使用。 也许有一天这些将以Swift语言提案结尾,但是现在您可以随意使用和分享您认为合适的摘录! 从集合(例如数组)中拉出元素的标准方法是使用Collection定义的下标: 如果Index不包含在集合的indices ,则系统将引发异常。 这意味着我们需要首先验证索引,然后访问元素: 上面的例子很常见。 在很多情况下(例如,更新可重用的UI时),如果元素不存在于集合中,则退回到nil至关重要。 我们怎样才能使它更容易? 让我们在Collection上添加一个新的下标,它可以一次将数组越界异常转换为nil : 由于我们的.text属性已经是Optional ,我们现在可以将其转换为单线! 另外,我们的新下标甚至接受Optional作为输入,并将通过方法传播该nil 。 我们可以在感觉满意的任何地方使用该下标,而在其他地方仍然可以使用内置的下标。 真好! 如果您的设计师提供RGBA颜色,您可能会注意到您的代码杂乱无章,如下所示: 我们如何才能缩短此方法调用,消除复制的除法逻辑并仍然保持轻巧? 一种选择是使用HEX值进行初始化,这是完全有效的方法,具体取决于场景。 但是,该逻辑需要字符串验证,提取,扫描和转换为RGBA空间。 不完全是“轻量级”。 事实证明,通过使用可变参数函数,我们可以创建一种超简洁的方法来初始化具有原始RGBA值的颜色。 一探究竟! 现在,创建相同的RGBA颜色变得很容易: 不到原始通话时间的一半! 请注意,我们使用第一个示例中的Collection[safe:]下标来增强此方法的功能。 想象一下,如果没有它,我们将不得不编写多少额外的代码…… 我们甚至可以省略alpha分量,仅在需要时定义RGB颜色。 此扩展不仅缩短了我们的代码,而且避免了整个代码库中的数学错字! 您是否曾经需要将Array转换为Array并发现自己正在与编译器抗争? 开发人员在StackOverflow上已多次要求使用此技巧,但我们对通常推荐的解决方案(使用compactMap (以前为flatMap )) compactMap 。 尽管在某些情况下可行,但此方法是为其他目的而构建的,并且可能产生意外的副作用。 我们发现Senseful的此解决方案是一个很好的方法。 这是我们喜欢的一些东西: 它只对序列进行一次迭代,使我们保持O(n)的复杂度 该方法的名称清楚地描述了其效果 它可以可靠地用于多维序列,没有副作用 解决方案如下所示: 非可选Sequence最后一个扩展是在我们不指定实际上包含可选序列的序列类型时帮助编译器。 […]

年度回顾2018:主要学习和个人成就

原始链接: 年度回顾2018:主要学习和个人成就 今天是2018年的最后一天,今年,2018年我的个人和职业生涯发生了很多惊人的事情…… shashikantjagtap.net 今天是2018年的最后一天,今年,我的个人和职业生涯发生了很多惊人的事情。 对于生命中如此美好的一年,对于2018年,我感激不尽。 去年,我写了类似的文章“我在2017年经历的十件事”自我回顾了我在2017年的工作和成就。如果您是我的博客a.ka的读者或关注者。 XCBlog,无论是在我的个人博客上还是在Medium或DZone上,您都必须对iOS工程活动充满热情,而不仅仅是在Xcode中编写功能开发代码(Swift / Objective-C)。 互联网上已经有很多Swift和iOS博客,但是XCBlog涵盖了苹果生态系统中iOS工程活动中的怪异事物,例如基础设施自动化,脚本CI / CD管道,处理代码签名,管理复杂的iOS基础设施,依赖管理等。 XCBlog一直领先于iOS自动化和DevOps空间中的新事物。 在这篇文章中,我将介绍2018年的关键学习,成就,成功,失败和福祉。 当科技行业赞赏您所做的工作,而辛勤的工作真的能带来回报时,这真的感觉很棒。 显然,这不是一个一夜之间的过程,就像一个SEO,内容/作品的真正价值逐渐显现出来。 DevOps 100通过TechBeacon 当我在TechBeacon发布的DevOps 100列表中获得一席之地时,这是我感到骄傲的时刻。 TechBeacon已发布了DevOps 100,DevOps 100名领导者,从业者和专家将在社交媒体上关注。 TechBeacon精心挑选了100名杰出作家,演讲者和领导者,他们可以教给您很多有关DevOps的知识。 主题包括通用DevOps,云,容器,无服务器,监视,系统工程等。我在通用DevOps部分中被归类为我在iOS应用程序的DevOps和CI / CD中的贡献。 您可以在此处详细阅读我的整个DevOps旅程。 FitSmallBusiness评选的2018年最佳技术影响者 对我来说,另一个值得骄傲的时刻是当它被FitSmallBusiness选为2018年度最佳技术影响者名单时。 很高兴能跻身顶尖技术影响者之列。 FitSmallBusiness凭借强大的社交媒体影响力在网络上搜寻技术影响者,并将以下2018年顶级技术影响者列表汇总在一起。他们发现列出的影响者具有与技术行业以及相关行业的杰出证书,专业知识和技能,以及数量惊人的社交媒体关注者。 2018年最大的成就是我在伦敦成立了自己的公司XCTEQ Limited。 公司的使命是在组织内部实现移动DevOps和智能测试自动化实践,并为客户提供丰富的营销内容。 我通常在周末在XCTEQ限时工作,因为我仍然想长期从事全职工作。 目前,XCTEQ为客户提供博客或白皮书等内容,但计划雇用和培训更多作者。 与XCTEQ客户端(例如Bitbar和Nevercode)合作的主要好处是,我可以提前接触到闪亮的新工具和技术。 例如,与Nevercode合作使我有机会与Flutter和Codemagic CI / CD一起用于Flutter应用程序。 同样,与Bitbar的合作使我有机会尝试使用世界上最大的AI驱动的应用程序测试解决方案(也称为AI Testbot)来使用人工智能测试移动应用程序。 您可以在此处找到有关XCTEQ产品,服务和客户的更多信息 作为一名充满激情的技术博客,我今年写了约75篇文章。 其中一些写在我的个人博客上,另一些则写给客户或雇主。 XCBlog上的60帖子(个人博客) 今年,我设法在个人博客上写了60个帖子(包括这篇文章)。 这些帖子也重新发布在Medium和DZone上,这意味着,我每个月只能在自己的个人博客上撰写5个帖子。 您可以在shashikantjagtap.net上阅读所有这些文章。 Bitbar的11个帖子(XCTEQ客户端) Bitbar博客上有11个帖子,这些帖子包括XCUITest 101系列以及其他一些针对移动应用程序的基于AI的测试技术。 […]

[서평]功能性思维

用户对RxSwift的评论,与在Google上的评论一样。 RxSwift가매력적인로그래밍가그래밍이해했지만,만기에기초가되는지식이다。 로프 미리객체지객체로향과로점이다。 。사용이라는다두고바라이다。 ,가책의지막이있듯이,다,문이에다좋이있듯다。 。사재사용하고다。 있고스를사용하는객체지향로향이있고다있고재사재맞춘로그래밍이함수형다。 。사용하기함수를사때마다른가안되겠다。 。프그래밍에서 유유 유유유유。 커링 私有化和私有化(私有,公共)。 。가적인만들지작업이가능하다。 func add(x: Int, y: Int) -> Int { return x + y } 하자가함수다고다고가정하자。 항상1추추할할할있을까? func addOne(x: Int) -> Int { return add(x: x, y: 1) } 。가있듯이이된된다。 일이다。 항상지만2,3,4,5될까가해주는될까? 4추가적인가필요하다。 자이렇게해보자。 func add(_ x: Int) -> (Int) -> Int […]

修复iOS MAP上的摩洛哥边界

在摩洛哥建立基于位置的应用很麻烦。 作为公民,您需要格外小心,并确保将摩洛哥地图与撒哈拉沙漠一起显示,因此在这里,我将解释如何以一种精美而有趣的方式来固定边界。 其他开发人员已经写过有关骇客建议的信息(隐藏跨边界或设置固定区域…)。 但是,我相信它们会使映射体验完全不同,并且根本不友好。 因此,我不会在这里写教程。 相反,我想演示一个使用iOS 7中引入的Tile Overlay实现的示例应用程序,并演示自定义MapKit框架以更正摩洛哥王国地图现在变得多么容易。 代码源在我的github仓库中可用:https://github.com/a6delali/MAMapView 以下是使用Custom Map类最终实现的示例 请查看 http://www.viggiosoft.com/blog/blog/2014/01/21/custom-and-offline-maps-using-overlay-tiles/ 深入了解什么是图块叠加以及它们如何显示作品

iOS体系结构:MVVM-C,场景(2/6)

场景可以被认为是应用程序内部的section , feature或用例 。 一个很小但是内部完整的包含整个应用程序的一部分。 您要制作场景的大小取决于您。 我通常会发现将场景定义为功能非常有效。 它通常是1到4个屏幕的集合,旨在实现一个单一的目的。 例如登录流程,图片上传过程或购买渠道。 首先,我在Xcode项目中创建一个名为Scenes的文件夹,其中将包含所有场景的子文件夹。 在一个特定场景内(如您在下面的“ 搜索”示例中可以看到的),我拥有与该场景有关的所有部分。 从协调员到视图。 这些文件夹结构将针对每个场景重复。 我认为这有助于将应用程序的每个场景划分为更大的整个应用程序中的完整的独立设备。 我可以将这个场景的文件夹拖到另一个应用程序,它应该可以正常工作。 从上面的屏幕快照中可以看到,每个场景都应该有自己的故事板 ,并且与场景名称相同。 在iOS社区中,故事板仍然是一个有争议的话题。 有些人无法想象不使用情节提要来创建iOS应用程序,而社区中的其他一些人不会因为使用情节提要而陷入困境。 他们要么以编程方式创建视图,要么仅在每个屏幕上使用XIB。 对情节提要板的抱怨之一是,有时开发人员会将其应用程序的所有屏幕都塞进一个大型情节提要板中,这变得一团糟,尤其是当有多个人在同一个情节提要板上工作时。 一定喜欢那些无法理解的GIT合并冲突,在这些冲突中,您必须解析XML文本以了解正在发生的事情。 但是使用情节提要板仍然有很多好处。 它们使尺寸分类和自动布局变得轻而易举,它们允许静态表视图,它们使您可视化应用程序的流程等。 我不会在这里介绍使用情节提要的所有优点和缺点,但是我想我已经找到了中间立场。 每个场景都应该有一个情节提要,其中仅包含该场景中包含的ViewController。 这对于防止合并冲突大有帮助,因为通常只有一个开发人员正在开发应用程序中的特定功能或部分。 最重要的是 ,尽管我确实使用情节提要的面板来包含每个场景的ViewController,但我并未在情节提要上设置任何顺序或关系。 它仅用于为特定场景中包含的每个ViewController配置视图。 这一点很重要。 我们可以使用情节提要,但不能使用segues或可以使用界面生成器创建的任何其他类型的关系。 原因是协调器将负责处理导航和ViewController之间的关系。 许多人认为协调器和情节提要不能并存。 实际上,如果您不使用搜寻或关系,它们可以很好地协同工作。 有关协调员的更多信息,请继续阅读本系列的下一篇文章: iOS架构:MVVM-C,协调器(3/6)

我的小挑战

每个开发人员在努力进行项目时都会收集自己的挑战。 我收集了一些您可能不知道的挑战。 帖子将随着新挑战而更新 让我们从iOS新版本和xCode更新开始; →如果您要从公司的iOS应用程序负责,我绝对不建议下载并开始使用新的xCode。 您可以从此处下载新的xCode,并开始同时使用当前和新的xCode。 →您以某种方式下载了新版本的iOS,但新的xCode仍然不稳定。 您想回到以前的xCode,但是有问题! 您无法在以前的xCode中使用更新的设备来构建应用。 在这种情况下,我建议您下载新的xCode(例如xCode 9.1 beta)并转到新的xCode路径; /Downloads/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/ 并复制iOS版本的最新文件并转到您当前的xCode路径; /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/ 并将其粘贴到当前的xCode DeviceSupport文件中。 您可以在更新的设备中构建应用。 有点棘手,但是可以用😉 UIImage内存问题 实际上,这是一个很小的问题,但是它很容易知道。 在imageView上为一堆图像设置动画时,我遇到了内存问题。 关键是: 如果您像这样创建UIImage→ 让图片= UIImage(名称:“ imageName.png”) 首先,该方法在系统缓存中查找该映像。 如果系统缓存中存在映像,请从缓存中返回映像。 如果系统高速缓存中不存在图像,则方法将为您查找并加载图像数据。 如果您像这样创建UIImage→ 让图片= UIImage(contentsOfFile:“ imageName.png”) 图像将仅显示一次。 这样可以将一次性使用的映像排除在系统映像缓存之外。 您可能要为应用程序的启动屏幕创建图像动画,因此请注意此👆 创建自己的片段😉 很多人不知道片段的存在。 但是它们确实是xCode的有用功能。 如果您对摘要不了解,可以在这里查看↓ 使用Xcode管理Swift代码段– Marco Santa Dev 您每天编写数百行代码吗? 您想节省输入更少代码的时间吗? 好吧,代码片段… marcosantadev.com 如果您已经知道摘要,请检查此仓库↓ burczyk / XcodeSwiftSnippets XcodeSwiftSnippets – […]