Tag: swift

Metal Camera教程奖金:在iOS Simulator中运行Metal项目

在《金属相机教程》系列中,我们创建了一个简单的应用程序,可以在屏幕上实时渲染相机帧。 但是,此应用程序使用的是Metal框架,iOS模拟器中没有该框架。 基本上,如果您选择模拟器作为构建设备,则您的应用甚至都无法构建,这很可惜,例如,要添加单元测试,而无需在未将实际设备连接到计算机的情况下就可以运行它们。 Metal某些部分具有针对桌面处理器体系结构的存根实现,这意味着您至少可以构建该应用程序(仅是发现它在模拟器上无法正常工作)。 Simulator甚至不存在其他部件,例如MetalKit ,因此您必须将导入包装到条件编译块中,如下所示: import UIKit import Metal #if arch(i386) || arch(x86_64) #else import MetalKit #endif 我们检查当前的处理器体系结构是否为台式机,在这种情况下根本不导入任何仅ARM的框架。 请注意, MetalKit中的类也不可用,因此您也需要使用它们包装任何代码: public class MTKViewController: UIViewController { #if arch(i386) || arch(x86_64) #else /// `UIViewController`’s view private var metalView: MTKView! #endif // MARK: – Public overrides override public func loadView() { super.loadView() #if arch(i386) || arch(x86_64) NSLog(“Failed […]

适用于iOS的Firebase,无效的API密钥

目前,由Google拥有的Firebase如今已成为最受欢迎的云托管NoSQL / JSON数据库,从博客文章到YouTube视频都有大量的教程。 您可以免费学习基础知识😎(了解基础知识后,您可以自己学习高级知识,对吗?😆) 该媒体不会教您如何使用Firebase,而是向您展示Firebase中的常见错误。 (如果我错了纠正我!) 请求中提供了无效的API密钥。 通常,我们不想面对学习状态下教程中未解决的任何问题。 这就是所谓的动机。 好吧,聊够了! TL; DR 重新下载GoogleService-Info.plist文件 Firebase身份验证 要在iOS项目中使用Firebase,首先需要创建一个Firebase项目并向其中添加您的iOS应用(捆绑ID)。 然后,您需要将`GoogleService-Info.plist`添加到iOS项目中并安装 Firebase框架。 现在,我假设您已按照说明进行了所有设置,例如“ FIRApp.configure()”,并且可以使用基于密码的帐户使用Firebase编写一些身份验证代码。 可选(错误域= FIRAuthErrorDomain代码= 17023“请求中提供了无效的API密钥。” UserInfo = {NSLocalizedDescription =请求中提供了无效的API密钥。,error_name = ERROR_INVALID_API_KEY}) 问题是GoogleService-Info.plist文件没有API_KEY项。 如果您四处搜寻,可能会得到很多答案,其中之一就是设置API密钥并将其添加到PLIST文件中。 不要那样做! 您可能会遇到另一个错误。 发生内部错误,请打印并检查错误详细信息以获取更多信息。 访问未配置。 之前尚未在项目xxxxx中使用Google Identity Toolkit API,或者已将其禁用。 通过访问https://console.developers.google.com/apis/api/identitytoolkit/overview?project=xxxxx启用它,然后重试。 如果您最近启用了此API,请等待几分钟,以便该操作传播到我们的系统并重试。 这是因为给定的API密钥不是来自Firebase项目。 请注意,它也不是Web API密钥 。 解 要解决此问题,您需要做的就是重新下载GoogleService-Info.plist文件,并替换为iOS项目中的文件。 您将在新的PLIST文件中看到一个“ API_KEY”项。 要再次下载文件: 转到Firebase项目概述 点击iOS应用的⠇(三个垂直点),然后选择管理 向下滚动,您将看到一个下载PLIST文件的按钮 结论 这个小问题应该首先解决。 对于初学者来说,这很麻烦。 […]

内顿·斯威夫特?

目标– C varken nerdençıktı? 迅速。 Herkesinmuhteşemuygulamalargeliştirebilmesiiçingüçlüveaçıkkaynaklıbir dil。 – 苹果 迅速; iOS,Mac,Apple TV和Apple Watch观看Apple Watch的应用程序。 Geliştiricilere和她的zamankinden daha fazlaözgürlüksağlamakiçintasarlandı。 斯威夫特(kullanımıkolay veaçıkkaynaklıbir dil)。 Buyüzden,bir fikri olan herkes,şimdiinanılmazşeyleryaratabilir。 – 苹果 Swift ,Apple iSletim sistemlerine(iOS,macOS,watchOS,tvOS)uygulama yazmakiçinkullanılan2 dilden biridir。 目标— C varken nerdençıktı? Swift 2010’un temmuzayındaChris Lattner *tarafındanyazılmayabaşlanıyor。 Swift“ Objective-C,Rust,Haskell,Ruby,Python,C#,CLU ”非常不错。 克里斯·拉特纳(Chris Lattner) 驾驶Apple’den特斯拉(Tesla)汽车公司的特斯拉自动驾驶仪。 Ordan da kendisine uygun bir yerolmadığınısöyleyerekçıktıveşu和Google’da kariyerini […]

Swift —在Bitbucket上的持续集成

本文是同时介绍TDD和多个CI概念的指南的一部分。 您可以在 此处 查看介绍性文章 。 当使用位桶时,我们将使用CircleCI来满足CI的需求,因为它与TravisCI非常相似且易于配置。 不幸的是,它仅适用于对我们不起作用的Linux机器(因为我们需要一台macOS机器来构建我们的xcode项目)。 但是CircleCI确实提供了为期两周的免费试用,因此您可以签出它,看看它是否值得。 让我们开始工作: 首先在CircleCI网站上创建一个帐户,然后对您的Bitbucket帐户进行配对(您也可以使用您的BitBucket凭据直接登录Travis,从而无需进行配对过程)。 从项目列表中选择所需的项目,以便CircleCI可以为其生成Webhook。 现在,CircleCI已挂接到您的项目上,并且当您的代码更改时,它会收到通知(默认情况下,它被设置为在每次推送以及合并时都运行)。 现在是时候告诉CircleCI每次对代码进行推送更改时要做什么。 为此,我们必须将一个文件添加到项目的根目录,并将其circle.yml 。 CircleCI的配置方案需要更多的指令(​​与Travis相比),如果被多个文件分割,则更容易做到,这就是我们要做的。 首先在项目的根目录下创建一个Scripts文件夹。 现在创建以下文件(每个要点底部的文件名): 7.现在配置CircleCI并准备就绪! 提交并推送您的更改(确保包括.yml文件和所有脚本),应该通知CircleCI,它将开始构建您的项目并运行测试! 如果一切顺利,您应该得到一个类似于以下的屏幕: 有些不对劲? 请在下面发表评论,我将尽力帮助! 9.随着CircleCI的启动和运行,我们现在应该利用它的功能并使我们的CI工作流更加强大。 SwiftLint Swiftlint是一种工具,可以帮助您识别和标记代码的某些部分,这些部分可能不遵循社区或您的团队所遵循的样式规则。 因此,它将帮助您坚持简洁的代码惯例,并在整个团队之间保持共同的风格。 Swiftlint可以在本地或CI服务器上运行。 让我们先在本地运行它: 首先在控制台上运行brew update和brew install swiftlint ,然后在转到项目的根文件夹后,运行swiftlint 。 而已! 短毛猫会检查您的代码并提出可能发现的任何问题! 2. SwiftLint的另一个优点是,您可以配置XCode来运行它,以便在每次构建后进行编码时都能得到实时警告! 为此,我们必须在Xcode的构建过程中添加一个新的“运行脚本阶段”,并包含以下脚本: 尽管非常有用,但SwifLint有时还是会有些干扰。 在某些情况下,您可能会收到您确实不想更改的代码的警告(例如上面的AppDelegate甚至是测试类,它们本来就很长)。 为避免这种情况,您可以配置.yml文件以指定文件排除项。 我希望您更明确一些,并像 // swiftline:disable:next line_length 有了SwiftLint的本地部分,现在该让CircleCI处理它了。 首先,将新文件添加到Scripts文件夹中: 现在是时候创建一个CodeCov帐户了。 使用您的Bitbucket帐户注册,然后从列表中添加您的存储库。 您应该看到类似于此屏幕。 记下令牌ID,因为稍后我们将需要它。 最后,我们现在可以配置CircleCI,以便每次构建项目时也可以检查覆盖范围。 我们必须在yml文件中添加两件事: […]

Swift中的值类型和引用类型

在Swift中,初学者会混淆Class和Struct之间的区别以及何时实现而不是实现。 例如,这是每种类型的实现方式: 乍一看,这两种类型没有什么不同。 两者的声明方式相同,但其类型除外。 实际上, 类和结构是灵活的构造,它们成为代码中的构建块。 根据Apple文档: 您可以使用类和结构来定义要在代码中实现的自定义数据类型。 而且,它们的属性和方法也以完全相同的方式提供功能。 那么,什么使类和结构与众不同? 您什么时候使用另一个? 类和结构之间的主要区别在于它们自己的类型。 换句话说, 类是引用类型 , 结构是值类型 。 让我们进一步打破它们的定义: 通过作为引用类型, 类不保存该特定类的实际值或实际实例,而是保留对该特定实例的引用。 结果,您可以更改或变异先前声明为常量的特定实例上的存储属性或值,如以下示例所示: 在此,在将此类的实例创建并声明为常量之后,更改了其存储属性。 但是,该类的特定实例本身并未被突变, 只有引用存储属性才被突变。 不仅如此,一个类的几个即时变量或常量可以使用相同的引用: 换句话说,您还可以具有一个类型的多个实例,这些实例引用相同的现有实例或点引用,从而在某些情况下,在程序中使用类的选择不太安全。 可能危及代码安全性的另一个问题是,全局函数还可以更改存储的属性或类类型的特定实例的引用。 您可以在程序中的任何位置访问引用类实例及其存储的属性,这一事实使使用类成为程序的较不理想的选择。 另一方面, 结构或结构实例始终按值传递。 据说它们具有值类型并具有值语义。 这意味着此类型的每个实例本身就是特定的值。 因此,无法更改常量或其存储的属性,如以下示例所示: 在这里,程序在抱怨名为flare1的实例被声明为“ let”,它是一个常量,因此不能更改其存储的属性。 为了更改它,“ let”需要更改为“ var”以使其可变。 同样,没有全局函数可以更改结构的存储属性。 为此,需要在该结构的范围内声明一个变异函数,并将该结构的实例声明为“ var”变量。 同样,通过复制值而不是像类这样的引用来传递结构。 通过复制,将使用相同的值制作或“复制”该类型的新实例。 在下面的示例中,结构的两个实例变量具有可以具有相同的值,但是如果将变量值之一更改为另一个值,则另一个实例值不会更改,因为它的值已被实际复制: 结果,可以将结构视为更安全,因为除非声明为可变变量,否则实例的存储属性不会更改,它的方法需要声明为变异函数,而实例在传递给代码时按值复制。 在研究Swift时,您会发现许多基本数据类型(例如String,Array和Dictionary)都作为结构实现。 这意味着当将它们的数据分配给新的常量或变量,或者将其传递给函数或方法时,将复制它们。 因此,如果要对其进行突变,则需要将其实例声明为“ var”,如果要声明一个常量而不是对其进行突变,则需要将其实例声明为“ let”。 最好的习惯是养成在程序中计划代码以最好地声明实例类型的习惯。 除了类和结构之间在引用类型和值类型方面的差异之外,它们各自还具有更多差异。 例如: 类:1)可以从其他类继承,2)类型转换以解释实例,3)反初始化器使类的实例释放已分配的任何资源,4)引用计数允许对一个类实例进行多个引用。 结构:1)可以封装一些相对简单的数据值,2)在分配或传递该结构的实例时,将复制而不是引用封装的值,3)该结构存储的任何属性本身都是值类型, […]

学习移动应用程序开发的前十大网站– mukul sharma –中等

学会移动应用程序开发的前十大网站 寻找资料来学习新知识吗? 喜欢移动应用开发之类的吗? 好吧,你很好。 这正是您要查找的热门内容。 随着技术的进步和智能手机用户的出现,这种前所未有的趋势,您有了一个全新的境界,可以通过在官方平台上托管来工作并赚取相同的收入。 那为什么要等? 继续,从列表中选择一个,并开始开发过程。 1)新波士顿 好吧,这个名字听起来很古怪,但它又增加了一个谜。 它提供了多种免费的Android教程和视频(如果您更像是视觉类型的人),可以免费观看。 此外,您还有其他开发领域,例如游戏等。 2)Udacity 这个名字看起来很熟悉吗? 嗯,这是编码学校,它也提供开发android应用程序的课程,实际上是由Google建立的。 是不是很酷 好吧,你一定要试试看! 3)技术性的 由Paresh Mayani运营,这是一个网站,开发人员自己汇总了所有针对android开发人员的教程和开发指南,以及将android分类为初学者,中级和高级开发人员的方法。 4)Swift开发的IOS 8开发应用程序 由Stanford主持,通过使用iTunes,本课程正是成功开发适用于版本8的iOS应用程序所需要遵循的课程。而且,最好的消息是它们是完全免费的。 5)怪异柠檬XCode 6 这个特定的网站提供了许多有关使用XCode 6开发ios应用程序的教程。它提供了三门令人惊叹的全时课程,以实现最佳开发。 6)代码研究员ios开发课程 好吧,这是针对那些打算使用Objective C和Swift并包含Cocoa,UIKit等各种工具来开发iOS应用的开发人员的。不幸的是,它不是免费的,但您可以尝试一下,因为它们提供了优质的教程。 7)Coursera 是的,您没听错! 这个特定的网站为您提供各种类型的应用开发方面的广泛课程。 您还可以通过象征性的费用和考试获得相同证书的国际认证。 值得尝试! 8)Lynda.com 这是一个网站,您必须在其中注册才能真正开始学习过程。 但是很有趣! 请检查一下! 9)开发人员Android 由Google提供,这个特定的网站包含所有重要的规范和文档,您需要为应用程序开发过程铺平道路。 10)树屋 这是您可以轻松依赖的网站,可帮助您学习应用程序开发。 但是,您需要以象征性的费用进行注册。 它提供从初学者到高级水平的课程,因此订阅使您可以完全访问资源。 因此,继续抓住机遇! 学习愉快! 如果您想从头开始学习,请查看下面的视频。 第1课:wuxiaspear的移动应用程序开发简介

Swift 2中的可选

满足可选。 你看过这些 在整个Foundation和UIKit中,您将看到很多可选的选项。 它表示有值或没有值的上下文。 在Objective中,您可以拥有一个可以指向某物的指针,或者为nil。 但是Optional使它更通用。 您现在可以使用“ Int”,UIImage?,String?,UIWindow? …` 可选类型的想法并不新鲜,您可能已经通过`data看到了它。Maybe a = Nothing | 在Haskell中只是一个`,在Rust中是枚举Option {None,Some(T)}`,在Java 8中是ʻOptional `,在C#中是“ System.Nullable ”,… 在Swift中,可选项全部与`?`和`!`有关。 后者是为懒惰的 可选的是枚举 实作 可选使用关联的类型枚举和泛型实现 宣言 当你看到 实际上是 检查 当你看到 实际上是 强制展开 您可以使用`!`来强制展开可选项。 如果没有值,它将崩溃“致命错误:在展开可选值时意外发现nil”。 实作 强制展开运算符`!`的实现方式如下 隐式展开的可选 可选是好的,但是每次使用时都需要检查其值 如果您确定Optional始终具有一个值,则可以使用!!来定义“ Implicitly Unwrapped Optionals”,这是一个可选选项,在您使用它时会自动将其值解包 隐式解包的Optionals是Optionals,因此您可以检查nil并使用可选绑定 选配 因为optional是一个枚举,所以我们可以有值和nil的集合 可选绑定 我们可以通过`if let`使用可选绑定。 更酷的是,Swift现在支持多个可选绑定 双选 Swift具有双重可选的特殊语法,即`??` Double可选也是此强制转换的结果 无合并运算符 >如果nil合并运算符(a ?? […]

iOS的调查见解..第2部分

如果您错过了第一部分,这是iOS开发人员调查分析的第二部分。 该调查的目的是收集信息和反馈,并使用此数据作为该杂志上未来帖子的输入。 Q6,您最喜欢iOS上的什么? 这个问题是关于寻找什么使iOS变得有趣而又出色的原因,尽管没有人能真正捕捉到使用iOS的整个过程,但毫不奇怪,迅捷是赢家! 新语言以惊人的速度进入了平流层,是有史以来最快的采用率之一。 关键见解 如果您还不迅速,那就落后了! 它不仅有趣且直观,而且在许多方面使我们的工作“更加轻松”。 谁曾在objc中写过一个块,谁也不会同意。 有一个关于它的整个网站,迅速,另一方面是美丽而富有表现力的。 Q7和Q8,您对iOS的需求如何? 现在让我扮演魔鬼的拥护者,说还有很多地方需要改进,而且将一直如此,这就是使事情向前发展的原因,一次总有好有坏。 缓慢的Xcode构建和Apple Sign /分发过程是预期的主要抱怨来源。 关键见解 尽管情况有所好转,并且每年都在改善,但仍然存在一些痛点,有些问题可以使用Fastlane等出色的工具来处理。 其他一些诸如缓慢的xcode构建(尤其是在大型项目中)则比较棘手。 人们采用迦太基而不是Cocoapods,这是一个了不起的工具,在某些情况下已经看到了改进,尽管至少在我看来,Cocoapods仍然是目前的最佳选择。 尽管如此,尽管如此,我们仍然希望Apple节省一天的时间,缩短下一个Xcode版本的构建时间。 问题9和问题10,路线图? 问题九和十是很重要的,这些是我一直在寻找的答案,这些答案最终将帮助我利用我自己的观点和品味为该杂志开发新内容。 结果显示出非常有趣的方面: – 持续集成| 交付 (*如何改善当前的工作流程,例如采用fastlane之类的工具) – 测试,模拟和存根 (*如何在iOS上编写测试。模拟,存根,视图控制器测试,UI测试) – RxSwift和反应式编程 – 适用于iOS开发人员的 草图 关键见解 这种见识比我的要多得多,可以从这篇文章中分享和借鉴,但是从这里获得的教训是,本出版物的下一篇文章将首先尝试回答并满足这些需求。 结论 希望大家喜欢这个系列,根据这个反馈,我开始了一个旨在传达所有这些信息的项目。 该项目将为一系列帖子提供输入,这些帖子将从下周一开始发布。 与往常一样,任何想法,疑问或反馈都值得欢迎。 =)

改进Swift中的完成块

从 Novoda博客 交叉发布 。 在Objective-C和Swift中,完成模块都是非常熟悉的模式。 这是一个有用的功能,它使我们可以在处理异步调用的同时将方法调用和生成的代码保持在一起。 可以在所有iOS代码中找到完成代码块,例如从URLSession提取的以下示例: let task = URLSession.shared.dataTask(with:aUrl,completeHandler:{(data,response,error)in //在这里处理结果 }) task.resume() 只要您避免回调地狱,它们是处理方法中单个结果的一种简短且易于编写的方法。 如果您有多个结果或来电,最好使用委托模式。 完成块有问题,但并不总是显而易见的,我们可以通过实现一个实现看到这些: let task = URLSession.shared.dataTask(with: aUrl, completionHandler: { (data, response, error) in if let data = data { parse(data.asJSON) } else if let error = error { display(error) } else { // no data and no error… what happened??? […]

初学者最好的iOS 10和Swift 3教程

本文将向您介绍有关iOS 10,Swift 3和Xcode 8编程的最佳课程。成为优秀程序员的最快方法是向优秀老师学习。 您将成为专业的程序员,以更新工具,最新的编程语言,即使您的水平是孩子。 完整的iOS 10开发人员课程—构建21个应用程序 他的名字叫Rob and He,是世界上最受欢迎的编码课程的创建者,也是Udemy的第一位课程讲师,有40万名学生和20,000颗五星级评论。 根据讲座的质量判断,他的其他任何课程都是非常独特的,易于理解,并随附文档附带的源代码。 我相信您会满意的,就像成千上万的学生参加了他的课程一样。 iOS 10和Swift 3:从初学者到付费专业人士 本课程的设计类似于面对面的代码训练营,旨在为您提供最多的内容,并以最少的费用提供帮助。 完成本课程后,您可以执行以下操作: 将应用提交到应用商店 了解编程和基本算法 流畅使用Swift 3和iOS 10 应用于jr iOS开发工作 担任iOS承包商 现在就拿 完整的iOS 10开发人员-使用Swift 3构建真实的应用程序 使用Xcode 8和Swift 3制作REAL iOS 10应用,例如Instagram,Time Travel或GPS Finders。 包括源代码。 该课程每周不断更新-总是有令人兴奋的新内容可供发现! 现在就拿 Swift 3-学习使用Apple的新语言进行编码 学习使用Xcode Playgrounds对Swift 3进行编程。 成为世界上增长最快的编程语言的一部分! iOS 10 在本课程中,您将带领您在本地设置Swift,该语言的基础知识,如何与其他通用语言(包括Objective C)进行比较以及如何开始新项目。 本课程旨在全面介绍Swift,以便您可以立即开始进行实验。 完成后,您将了解Swift代码的基础,并将能够开发自定义应用程序。 您还将获得使用Xcode的新.playground文件的经验。 该课程材料会定期刷新以包含所有最新更新和信息,并且由于您在注册时被授予终身访问权限,因此您可以依靠此课程将您的Swift技能保持在最前沿。