结果:『学习编码2』 世界构建 ,构建循环和自己的难题。 最后,我完成了世界建筑区。 只剩下一个区域! 这是我的任务“构建循环”的解决方案代码。 让character = Character() var gemCounter = 0 bluePortal.isActive =否 yellowPortal.isActive =否 greenPortal.isActive =否 world.place(字符,朝向:向南,在列:7,行:3) world.place(Block(),atColumn:1,行:3) world.place(Block(),atColumn:1,行:0) world.place(Block(),atColumn:0,row:2) world.place(Block(),atColumn:3,row:3) world.place(Block(),atColumn:6,行:3) world.place(Block(),atColumn:6,行:0) 而totalGems!= gemCounter { 如果character.isOnGem { character.collectGem() gemCounter = gemCounter + 1 } 如果character.isBlocked { character.turnRight() } character.moveForward() } ^您可以在Medium中使用代码块:Cmd(Ctrl)-Alt-6 最后的任务“自己的难题”似乎就像是Minecraft。
因此,上一篇文章写了有关如何使用Alamofire进行联网的文章,这使我回想起最初开始获取数据的时间。 一团糟。 就是这样: 假设您需要执行GET请求才能说出两个端点。 您最有可能做什么? 您很可能会复制第一个GET请求,然后将其粘贴并更改一些内容,例如端点和模型等。 您可能会执行以下操作: 当您添加更多请求时,这很快会使您的代码成为噩梦,更不用说看了。 这就是Generics发挥作用的地方。 我们可以使用更简洁的代码将这两个请求合并为一个函数。 就像上次一样,我将对所有API端点使用https://jsonplaceholder.typicode.com/。 模型 我们的第一个端点是: https://jsonplaceholder.typicode.com/posts : https://jsonplaceholder.typicode.com/posts 对于/posts ,我们将获取userId , id , title , body 。 实施泛型 现在我们有了数据模型,让我们设置通用函数。 如果您阅读了我有关Alamofire的上一篇文章,您可能会注意到一些差异。 而不是返回responseJSON我们只是返回response 。 同样,我们只获得response.data而不是response.data 调用我们的函数 最后,我们在使用JSONDecoder()地方进行了do catch 。 现在我们可以调用通用函数: 很简单,但是我们只给出一个url字符串,并给它一个可解码的模型。 现在我们有了通用的网络请求,可以将其用于所需的任何端点。 我们只需要创建一个可解码的模型,然后传递url端点即可。 然后再次 让我们调用https://jsonplaceholder.typicode.com/comments /comments返回一个postId , id , name , email , body 。 现在我们要做的就是调用我们的泛型函数。 我们可以继续前进,尽管我觉得您明白了。 如果需要更多请求,只需为该端点创建一个模型,请确保您符合Decodable ,然后调用通用函数并传递url和模型。 […]
使用AsyncDisplayKit为iOS应用程序开发时间线视图时遇到了挑战。 所以这篇文章会告诉你我是怎么做到的 为了制作时间线视图,我为每个具有时间,标题和内容的时间线创建一个ASCellNode,重要的是点。 时间,标题和内容可以通过ASStackLayoutSpec进行管理,点可以使用ASCenterLayoutSpec和ASOverlaySpec进行管理 并连接所有点,我们需要添加垂直线,在这里我使用ASDisplayNode作为它,并通过调用addSubNode方法手动添加它。 使用ASDisplayNode绘制垂直线有点棘手,只需将backgroundColor用作线的颜色,并将width用作度量所需线的粗细。 在这种情况下,我使用2条垂直线,从单元格的顶部到点的顶部,从点的底部到单元格的高度。 完成所有这些代码后,我们将获得如下视图: 是的,这差不多完成了,但是所有单元之间都有一条水平线。 因此,我们需要为tableNode设置eparatorStyle。 完成done 可以从我的github访问本文中使用的所有代码 tarigancana / TimelineWithASDK TimelineWithASDK –使用ASDK创建时间线视图 github.com
Design Pattern是演讲,论坛甚至是15分钟的休息谈话中的常见主题。 您可以在书籍或互联网上找到很多关于它的东西,以及使用橡皮鸭🦆,咖啡店☕和比萨店🍕的许多示例。 当我开始学习时,我通常会理解这种模式,但是在考虑如何将其应用于我的代码时遇到了很多麻烦。 我知道Factory模式用于创建对象,但是为什么需要它呢? 我真的需要一个Factory来创建我的对象吗? 我写这篇文章的目的是带来一些我在项目中使用的设计模式的真实示例。 战略 策略模式可以在运行时选择算法。 代码不是直接实现单个算法,而是接收运行时指令,说明要使用的算法系列中的哪个。 我们可以基于运行时使用不同的算法,换句话说,我们不在乎实现是如何完成的。 算法需要一个知道如何fly的对象,一个Duck class也知道如何fly以及一个Rocket class 。 我们的算法不在乎我们的实现是否需要展开翅膀或一加仑的气体。 使用策略解决问题 在这个项目中,我们需要能够接收viewController但是我们还需要它具有一些预定义的行为,并且这是应用Strategy模式的理想场所。 移动应用程序中常见的ViewController是Login因此只需创建定义我们的LoginViewController操作和依赖项的协议即可。 我的意思是,我们可以将LoginViewController注入我们的项目中,我们不关心UI是否具有tableView ,任何animation或验证方法,但我们需要它知道如何执行login 。 您可以在此处阅读有关此特定问题的更多信息。 厂 工厂方法模式处理创建对象的问题,而不必指定将要创建的对象的确切类。 当您需要在运行时创建对象时,工厂模式很有用。 因此,如果用户想要芝士披萨,则如果他/她想要意大利辣香肠,则创建一个CheesePizza()创建PepperoniPizza() ftw。 使用工厂解决的问题 在使用strategy模式解决viewController注入问题的同一项目中,我们使用factory模式能够在运行时创建对象,并将其所需的所有依赖项传递给它们。 我们需要推送一个LoginViewController实例,可以使用诸如Storyboards , xib或view coded类的不同方法来创建该实例。 我们有一个工厂实例,可以通过更改工厂本身来创建对象的方式进行注入。 对于Factory的实例,我们只需要调用build方法。 这个工厂可以是我们并不在乎的ViewCodedLoginViewControllerFactory或StoryboardLoginViewControllerFactory的实例,我们只需要它来实现返回LoginViewController的build方法。 在这里,我们为每种对象都有一个工厂,但是我们可以有一个工厂,该工厂知道如何从storyboard xibs , xibs或viewcoded构建ViewController 。 装饰器 装饰器模式允许将行为静态或动态地添加到单个对象,而不会影响同一类中其他对象的行为。 这是我最喜欢的模式,装饰器模式的经典示例是想在咖啡中添加鲜奶油并根据饮料计算新价格和描述的咖啡店。 使用装饰器解决问题 对于每个服务调用,我们需要不同的API版本,这可以通过许多不同的方式完成,但是我们使用此模式将自定义Header添加到Request 。 通过这种方法,如果将来一个API调用应在其标头中添加另一个参数,我们也可以做好准备。 我们还需要过滤请求中的结果。 可以通过创建新方法或更改请求的工作方式来完成。 我们决定使用Decorator来添加此行为,因为在其他类中使用了我们的服务,并且我们希望在先前的实现中更改最少的行数。 适配器 适配器模式是一种软件设计模式,它允许将现有类的接口用作另一个接口。 它通常用于使现有类与其他类一起使用而无需修改其源代码 […]
Swiftではよくそのビルド时间が问题として话题になります。 コンパイラに型推论をさせすぎない 模块分割をする Mac Proを买う などなど,対策方法はあります。 原因の1つに,ファイル数が増えれば増えるほどビルドに时间がかかるというものがあります。 FiNCでは931ものSwiftファイルが存在していました。。 ドルド时间を検证 実际にファイル数が増えると,どれくらいビルド时间が変わるのかというのを简易的に検证してみました。 ViewControllerとViewModelを1ファイル内に分けずにおき100ファイル持っているプロジェクトA #プロジェクトA #ViewController1.swift 导入UIKit 类ViewController1:UIViewController { 私人让viewModel = ViewModel1() } 私有类ViewModel1 { } ViewControllerとViewModelを2ファイルに分けた组み合わせを100组持っているプロジェクトB #プロジェクトB #ViewController1.swift 导入UIKit 类ViewController1:UIViewController { 私人让viewModel = ViewModel1() } #ViewModel1.swift 进口基金会 类ViewModel1 { } プロジェクトABでそれぞれclean buildを10回试してみたところ,プロジェクトAの方が30%ほどビルド时间が短くなるという结果が出ました。 1ViewController,1ViewModel Swiftの特徴を生かした1ファイル2クラス FiNCではMVVMを采用していてほとんどの画面で,ViewControllerとViewModelが1つずつセットで存在で。 単纯に考えても1画面につき最低でも2ファイル,TableViewを使う画面ではCellもあるのでもっと沢山のファイルを使います。 画面が増えれば増えるほど大量のファイルを使用することとなるので,なんとかしなければ。 ということで,1つのファイル内にClassを复数书くことができるSwiftの特徴を利用して,新规作成时には1つのファイル内にViewControllerとViewModelをセットでおくことを试しています。 メリットとデメリットを天秤にかけた选択 がViewControllerが肥大になることや,可読性の问题がないわけではありません。 1つのファイル内にClassを复数置くことで起きる问题とビルド时间とを天秤にかけた时に,FiNCではビルド时间の问题解决を优先しました。 尝试! Swiftの「スタートアップのSwift」という讲演では,「最初はミニマムで作り必要な时が来たら変更を加えていく」というような话もありましたが,仆たちも新规作成时にできるだけ无駄なファイルを増やさずに行こうという指南で开発をしています。 新しく加入したメンにはーには少し惊かれることもありますが,UITableViewが书かれたファイル内に复数のUITableViewCellが置かれていたりもします。 同じファイル内にViewControllerとViewModelを置くことでAccessControlを缚ることができます。 最后的课程FiNCViewController:UIViewController { […]
免责声明 :要撰写这篇文章,我必须在互联网上阅读很多东西。 另外,我还复制了其他文章中易于理解的示例和句子,以使本文有意义。 🤓 Apple文档链接提供通用链接。 什么是深层链接? 深层链接是任何将用户引导通过网站或应用程序首页到其内部内容的链接。 例如,直接链接到产品而不是首页。 例如,URL fb://可以打开Facebook应用程序,但是fb://profile/33138223345可以在Facebook应用程序中打开Wikipedia的个人资料。 如果您想与朋友分享来自amazon.com的鞋子,则可以发送一个深层链接,将您的朋友直接带到应用程序中的那些鞋子。 如果没有深层链接,您的朋友将不得不在App Store或Play Store上找到Amazon应用程序,将其打开到首页,找到“搜索”功能,然后尝试找到与您所穿的同一双鞋。 自定义URI方案是移动应用程序深层链接的原始形式。 它们就像为您的应用程序创建一个“专用互联网”,其链接类似于myapp:// path / to / content 。 自定义URI方案的优点是易于设置,并且大多数应用程序已经拥有一个。 缺点是,如果已经安装了相应的应用程序,则用户的设备仅知道此“专用互联网”,并且默认情况下没有优雅的后备选项。 与URI方案进行深度链接的变通办法是使用传统的http://链接来启动Web浏览器。 此链接包含JavaScript重定向到自定义URI方案,该重定向由网络浏览器执行以启动应用程序。 如果由于未安装应用而导致重定向尝试失败,则JavaScript会将用户带到App Store或Play商店。 这仍然是在Android上进行深度链接的主要方法,但是Apple于2015年通过发布Universal Links开始在iOS上阻止了这种方法 。 什么是Apple iOS通用链接? 苹果在iOS 9中引入了Universal Links,以解决自定义URI方案深层链接中缺少优美的后备功能的问题。 通用链接是指向网站和应用程序内的一部分内容的标准Web链接(http://mydomain.com)。 打开通用链接后,iOS会检查该域是否已注册任何已安装的应用程序。 如果是这样,该应用程序将立即启动,而无需加载网页。 如果不是,则将Web URL(可以是到App Store的简单重定向)加载到Safari中。 通用链接在iOS中如何工作? 资料来源:Branch.io 在Universal Links之前,在安装应用程序时打开应用程序的主要机制是尝试在Safari中重定向到应用程序的URI方案(像这样在应用程序的PLIST中注册)。 这将路由逻辑放入了Safari,但是无法检查是否已安装该应用程序。 这意味着开发人员将尝试在无法安装应用程序的情况下100%地调用URI方案,然后在不使用计时器的情况下优雅地回退到App Store。 iOS 9通用链接旨在解决此问题。 iOS将检查是否已注册通用链接( 而不是在包含该应用程序包ID的域中存在一个AASA(苹果应用程序站点关联)文件) ,而不是先单击该链接便打开Safari。 应用程式应开启的路径( […]
Swift,强大的开放程式语言,让人人创造杰出的App Apple Swift官网上的这段文字,会让人觉得只要是人,都可以写出一个杰出的App,然这段话所言不假,日本一位80几岁的阿嬷做到了,而且还上架到App Store!真是令人敬佩! 新闻连结&App Store上的“ hinadan” 60岁才接触电脑,日本81岁奶奶开发出iPhone游戏App |数位时代 日本一位81岁的奶奶,因退休后发现市面没有适合银发族的游戏App,60岁才开始接触电脑的她,决定自己学习程序语言,现在她设计的App已经在App Store上架。 www.bnext.com.tw 在App Store上的「hinadan」 阅读评论,比较客户评分,查看萤幕快照,并进一步了解“ hinadan”。下载“ hinadan”并在iPhone,iPad和iPod touch上尽享丰富功能。 itunes.apple.com 连阿嬷都会写App了,那么以我资讯背景的是否也理理所当然地要来深度学习了呢,刚好最近有幸拿到一台新的Macbook Pro,就决定了学习iOS App的开发,在网路上收寻了太多的教学资源,从变数宣告,进阶动画,AR Kit都有,而最后决定在Udemy上挑了三个课程来咀嚼咀嚼。 iOS 11和Swift 4-完整的iOS应用开发训练营 苹果手机编程-使用IOS11SWIFT4编写19个真实程序 深度浅出iPhone开发(使用Swift4) 在Udemy挑选课程主要可以由学生人数, 评论星等 , 课程大纲 …等等 ,而价格就不是在挑选课程中主要考虑的因素,因为只要Google一下Udemy优待码,实际上就是同类课程的价格都一样,重点是选择“自己需要的”! 接下来的会尝试发布一些学习Swift遇到的问题与解决的眉毛角角,从而做一个学习纪录,也好帮助自己这个健忘脑袋,避免忘记!
我正在研究一个机器人项目,该项目的核心是具有Ubuntu最小(无GUI)和Swift 3.0的Raspberry Pi。 普通Ubuntu的问题在于,它要求您具有监视器,键盘和鼠标。 所有这些都给您带来不便,我很乐意通过将其插入机器来完成所有操作。 可悲的是,这是不可能的。 经过一些试验,我已经能够实现这一目标。 接下来是这个强大的书呆子的故事。 步骤1:准备 获取Raspberry Pi 2或3,具有8Gb或更多内存(10类或更多)的SD存储卡,微型USB电缆(用于供电),以太网电缆和Wifi USB软件狗。 第2步:在SD卡上最少刷新Ubuntu 16.04服务器 从此处或此处下载Ubuntu服务器经典版。 这是Ubuntu服务器的一种风格,已从并非严格必需的所有内容中删除了它,因此它非常轻便。 现在,您必须刷新SD卡上的图像。 在网络上,您会发现很多多步骤命令行指南。 但这很疯狂,因为有一个很棒的应用程序,叫做Etcher.io,可以使流程变得异常简单,快速和安全。 下载Etcher应用程序(适用于所有平台),然后选择Ubuntu映像,SD卡(您必须将其插入计算机中)并进行刷新。 几分钟,它将完成并验证。 将SD卡放入RPi,您就可以摇滚了! 步骤3:将Rsh插入RPi 将新备份的SD卡插入RPi之后,请在RPi与路由器之间连接以太网电缆。 通过将Micro USB电缆连接到电源或计算机上,打开RPi。 请耐心等待几分钟,因为首次启动的时间比平时长。 然后打开路由器的仪表板,查看与以太网连接的设备。 您将看到设备主机名ubuntu-minimal 。 记下该设备的IP。 打开您的终端并输入: ssh ubuntu @ THE_IP_YOU_JUST_FOUND (密码ubuntu) 你应该在里面! 现在,您已通过网络连接到RPi。 唯一的问题是,您仍然需要通过以太网电缆将RPi保持与网络的连接。 但是,让我们解决这个问题。 步骤4:走向无线 首先,我们需要更新操作系统: sudo apt-get更新 sudo apt-get升级 安装wifi支持: sudo apt-get install wireless-tools wpasupplicant 现在重启。 […]
尽管我们现在使用的是iOS 11,但Storyboard的本地化仍然很难解决。 总的疼痛在亚述。 这是我在SmartShopper的iOS中想到的。 创建一个名为UILocalize.swift的文件(或您喜欢的任何名称)。 2.扩展要本地化的UI元素,通过IBInspectable添加LocalizedXxxx属性 例如,要向所有UIButton添加本地化标题支持,我们可以 扩展UIButton { @IBInspectable var localizedTitle:字符串? { 得到{ 返回nil //并不重要 } 设置{ 如果让newValue = newValue { self.setTitle(NSLocalizedString(newValue,comment:“”),用于:.normal) } } } } 3.返回UI Builder,所有按钮现在都具有一个名为Localized Title的新属性。 4.现在,我只需要将其添加到我的Localizable.string文件中,例如 “ ADD_TO_FAVOURITES_CAPS” =“ SIMPAN KE SENARAI KEGEMARAN”; 5.现在,当您使用英语以外的其他语言运行应用程序时,您应该获得翻译后的文字!
如何为纹理制作RxSwift交互式包装? 基本上,纹理提供了各种基本组件,如下图所示。 特别是,我专注于ASControlNode来制作反应式包装。 因为,基本上, RxCocoa提供了各种交互式包装器,例如UIButton点击包装器,UIGestureRecognizer事件包装器等。 参考:https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UIGestureRecognizer%2BRx.swift https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UIButton%2BRx.swift 因此,如果我专注于ASControlNode,那么我猜想我可以在ASImageNode(UIImageView),ASNetworkImageNode(UIImageView),ASButtonNode等上进行方便的交互式包装。 我提到了UIGestureRecognizer + Rx脚本,并将其重新制作为ASControlNode包装器。 并按以下代码所示进行扩展。 最后,您可以使用像这样的上层代码! 参考: 使用Texture(AsyncDisplayKit)改善Feed性能 못잡네。 。리돌보다발열이심합니다。 겠죠가최적화다는리소? +이앱이안정적이었는데이이모양이+…+와。 15만지고리20%광탈… medium.com GeekTree0101 / GTTexture-RxExtension GTTexture-RxExtension –基于ASControlNode的Texture RxSwift交互式包装 github.com