Tag: 编程

String或NSString,应该是

作为一种现代编程语言, Swift在过去几年中迅速普及。 尽管在生产开发中大量采用Swift可以带来很多方面的优势,但有时仍不可避免地要与基于Objective-C的框架或库进行互操作。 例如, String或NSString ,应该采用哪个或更适合我们当前的开发? 尽可能使用本机类型 通常,您应该尽可能使用Swift本机类型,因为它们经过优化可以编译以提高性能。 但是等等,我只是说不可避免 ,对吧? 让我们以基于Objective-C的类NSRegularExpression为例。 let str = “Hello, playground” do { let expression = try NSRegularExpression(pattern: “\\s{1,}”, options: [.anchorsMatchLines]) let range = NSRange(location: 0, length: str.characters.count) let matches = expression.matches(in: str, options: [], range: range) for match in matches { print(match) } } catch { print(error.localizedDescription) } 在上面的代码片段中,我们可以看到函数func […]

在Swift 4.0中使用索引循环字符串字符

假设您要在for循环中使用索引值来打印字符串的每个字符,执行此操作的一种非常简单的方法是:- let name =“ nick” //我们要打印的字符串。//0 .. <将为0中的i给出从0到(string.length-1)的数字范围。.<name.count { //在Swift中不允许使用操作名[i],或者让索引= name.index [name.startIndex,offsetBy:i] print(name [index]) } 之所以不允许使用name [i],是因为每个字符需要不同的内存量来存储,因此为了确定哪个字符位于特定位置,您必须从每个String的开头开始读取,并向前移动(偏移)1。如代码所示: //从start-index开始并向前迭代1 让索引= name.index [name.startIndex,offsetBy:i]

使用iOS推送通知–杰出发明–中

推送通知,也称为远程通知,是移动应用程序的一项非常有用的功能。 它们可用于向用户发送市场营销报价,通过提供个性化内容,实现聊天甚至触发一些在后台执行的操作来提高用户参与度。 真正有用的是,用户不必保持打开状态。 听起来不错,不是吗? 是的,但是有必要了解推送通知的工作原理,并学习如何正确设置推送通知以避免不必要的麻烦。 iOS 10新颖性 iOS 10除了提供短信,播放通知声音并在应用程序图标上设置徽章编号之外,还扩展了iOS推送通知功能,其中包括: 媒体附件 (图像,GIF,音频,视频), 使用3D Touch扩展细节视图, 通知操作,允许用户立即采取措施。 在下面的示例中,有一个带有图像的iOS 10推送通知和“赞”操作按钮。 这使开发人员可以提高推送通知的质量,并从此多功能功能中获得更多收益。 服务器 推送通知以Apple Push Notification service (APN)的名义发送,定向到已注册到APN的一个或多个特定设备。 为此,我们需要设置一个服务器来收集移动设备令牌,并使用它们通过APN发送推送通知。 听起来可能很复杂,但是不用担心,有很多现成的解决方案都可以使用,甚至可以免费使用。 让我们看一下同时支持iOS和Android的最受欢迎的服务: Google的Firebase云消息传递 推杆 混合面板 这些服务中的每一个都还提供其他功能,例如分析,A / B测试,崩溃报告,实时数据库甚至身份验证,但您不必使用其中的任何功能。 请注意,使用第三方服务有其缺点 ,例如: 如果您决定切换到自己的服务器 ,则需要与您使用的服务进行通信,而不是直接与APN通信,否则您将不得不重新配置您的移动应用程序。 您必须知道,数据是通过不受控制的服务器发送的,因此它可能与您有关数据保护策略有关。 在达到一定限制之前 ,某些服务是免费的 ,例如,Mixpanel仅允许您免费创建最多1000个用户配置文件。 如果您的应用程序流行起来,可能会很昂贵。 关闭服务后,您将有有限的时间迁移到另一个提供程序。 这种情况已经由Facebook维护的非常受欢迎的移动开发者平台Parse发生了 ,该平台已于2017年1月关闭。该项目现已开放源代码,您可以在自己的计算机上进行设置,但不能开箱即用。 火力基地 出于本文的目的,我们将使用Firebase Cloud Messaging (FCM)。 这是一个有趣的解决方案,尤其是在I / O 2016上,Google将Firebase变成了统一的移动平台,该平台已取代Google Cloud Platform成为在Android上处理推送通知的默认解决方案。 […]

在Swift中实现编程语言—第7部分:声明变量

注意:这是“用Swift编写编程语言”教程系列的第七部分。一定要检查 以前的内容 。 上一次我们完成编写用于解析变量名称的功能,并使用了一个预先用变量初始化的全局字典来测试我们的代码。 因此,实现我们的语言自然而然的下一步就是增加声明变量的能力。 到目前为止,我们仅实现了表达式解析,例如,我们可以在单个语句中解析标识符,运算符和数字( x + 5 * 6 ),并且缺乏解析多个表达式的能力。 表达式解析是从解析器的parse()方法开始的。 我们想要将该方法的名称更改为parseExpression() ,因为我们仍然希望parse()代表解释器的入口点。 因此,在解析器中,我们要替换几行: func parseExpression()throws- > Node { //是:func parse() throws- > Node … } 和: func parseParens()引发->节点{ … let expressionNode = try parseExpression()//是:try parse() … } 这个想法是让新的parse方法支持两种语句类型,分别由parseExpresssion()方法和parseVariableDeclaration()方法表示。 后者我们尚未实施。 在准备实现parseVariableDeclaration() ,我们必须首先做两件事 为新的关键字var添加TokenGenerators,该关键字代表变量声明的开始以及=符号,用于声明变量声明的表达式的开始。 为变量声明添加一个名为VariableDeclaration的节点 首先,我们导航到Token枚举并添加以下内容: 枚举令牌{ typealias Generator =(String)->令牌? 案例操作员(操作员) 案例号(浮点数) 案例标识符(字符串) 案例解析 […]

Swift 4的本地通知

Преждечеммыначнем,выможетескачатьначальныйпроект。 Приложениепредставляетизсебятаблицусоспискомтиповуведомлений。 Сейчасеслитапнутьпокакойлибостроке, 警报 сназваниемуведомления。 Кконцуэтоготуторилаэтодействиебудетотправлятьлокальноеуведомлениесссодержимымстроки。 Крометого,пользовательсможетвзаимодействоватьсэтимуведомлением,выбираядляэтоееилиилиили。 Преждечемвашеприложениесможетотправлятькакиелибоуведомления,пользовательдолжеодотьна。 Дляэтого,припервомзапускеприложениянеобходимовыполнитьзапроснаотправкууведомлений,длятого,чтобыпользовательмогегоодобритьилиотклонить。 AppDelegate用户指南UserNotifications import UserNotifications ВсвойствахклассасоздаемновоесвойствоnotificationCenterиприсваиваемэкземплярклассаUNUserNotificationCenterдляуправления。 .тобудетнашцентрнотификаций。 let notificationCenter = UNUserNotificationCenter.current() 使用didFinishLaunchingWithOptions options ,котораябудетсодержатьвсебеопции,доступн之前。 重要信息: badge , sound , alert和carPlay 。 let options: UNAuthorizationOptions = [.alert, .sound, .badge] Определившисьсперечнемпараметровоповещениямыможемзапроситьупользователяразреениенаотп notificationCenter.requestAuthorization(options: options) { (didAllow, error) in if !didAllow { print(“User has declined notifications”) } } Еслисейчасзапуститьприложение,томыполучимзапроснаотправкууведомлений Пользовательможетпоменятьнастройкицентрауведомленийвашегоприложениявлюбоевремя。 ВыможетеотслеживатьэтинастройкиприпомощисоответствующегогетераgetNotificationSettings。 completionтотвызовсодержит […]

Swift数据结构:堆栈

堆栈是一个简单的数据结构,可让您创建项目的线性“堆栈”(因此得名)。 它是一种LIFO(“后进先出”)数据结构,这意味着添加到堆栈中的最后一个项目是可以删除的第一个项目。 它有一些非常实用的用例,如果您今天在计算机上做过任何事情,那么您已经与Stack进行了交互。 您将了解当前在何处使用Stack以及如何使用它。 对于您的视觉学习者,这是一个图表。 堆栈显示有6个项目。 如您所见,我为每个项目赋予了绿色索引。 尽管在与Stack本身进行交互时并不会真正使用它,但它使我们能够依赖于已内置的数据类型Array来帮助我们组织Stack。 堆栈中的值没有按照任何特定的方式进行组织,除了以下事实:添加新项目时,所有当前值都向下移动一个索引,然后将新的索引添加到堆栈的顶部,就像这样做一样与一叠饭菜。 堆栈具有3个可以与之交互的函数。 我们将在下面简要讨论每个对象及其作用: 函数1:peek() 我们的第一个函数称为peek() ,它使您可以做到这一点–窥视堆栈中最顶层的元素。 它将返回该项目在顶部以供使用或仅供参考。 它不会改变堆栈中的数据。 函数2:pop() 顾名思义, pop()从堆栈中返回顶层项目,然后将其删除。 如果要删除最上面的项目并允许撤消该操作,此功能特别有用。 由于返回并删除了最上面的项目,请设想我们有一个应用程序,可让您输入要完成的任务。 提交后,它将位于堆栈的顶部。 如果您犯了一个错误或输入了错误的内容,则可以通过调用pop()并继续进行操作来删除它,也可以修改刚刚输入的内容,因为会返回该值。 您可以使用返回的文本填充文本字段,对其进行修改,然后重新提交到堆栈。 函数3:push() 函数push()将允许我们向堆栈中添加值。 就那么简单。 由于新的值已添加到堆栈的顶部,因此它会更改堆栈中的值。 现在,您知道堆栈是什么以及它如何工作(理论上),让我们继续。 聊够了,让我们动手吧。 💪打开Xcode并创建一个新的Playground。 删除所有样板代码并import Foundation 。 然后,在该行下面创建Stack结构,并添加一个私有变量数组,称为String类型的items 。 将其值设置为空数组:

Swift 4 Introduction系列1.4 — Swift数据类型转换

我们无法对具有不同数据类型的变量执行计算。 例如,我们不能添加带有整数(Int)变量的浮点数(Double)。 为了能够执行这样的计算,我们必须将整数转换为浮点数。 同样,我们不能使用UInt16变量添加属于数据类型Int8的变量。 对于数据类型之间的转换,语法如下: 让 = () 要么 var = () 要么 = () 数据类型转换的基本规则是: 要转换的数据类型可接受要转换的数据 。 因此,我们必须知道数据类型限制,以便我们能够正确执行转换。 要在位大小数据之间转换,我们需要使用以上语法。 例: 设numberA:UInt8 = 87 让numberB:Int16 = 43 设numberC = 23个let numberD = Int16(12)let numberE = Int32(numberA) var numberF = UInt16(numberB) 令numberG = UInt64(numberC)numberF = UInt16(numberD) 如上面的示例所示,我们可以在转换括号中包含数字文字,如NumberD所示。 要重新分配变量,我们需要将转换器的数据类型与等式左侧的变量匹配,如最后一条语句中的numberF所示。 对于声明,请注意,变量将采用转换器指定的任何数据类型。 我们还可以先声明常量或变量,然后再执行赋值。 请注意,转换器必须与声明的变量或常量具有相同的数据类型。 例: 设numberI:UInt64numberI = UInt64(numberA)var numberJ:Int16numberJ […]

作为iOS开发人员实习生的12周-第七周和第八周

模拟数据 有时功能需要尚未从api获得的数据。 例如,当构建数量步进器(使用户能够增加/减少一件商品的数量)时,需要最大数量,例如,最大数量为4杯矮胖的玉米炖煮的食物。 除非您有能力提供大量产品,例如400杯矮胖的玉米炖汤,否则建议设置最大数量限制! 设置api后,maxQuantity属性将在ProductOption对象中。 所以自然地,我为ProductOption添加了扩展: 我发现最后一个选项对我的用例来说是最简单的。 只需确保添加TODO注释即可提醒自己这是一个模拟,并在获得真实数据后将其删除。 您不想将模拟数据推送到生产环境中。 更新约束 SnapKit具有用于创建约束的.makeConstraints。 这周我发现了.updateConstraints。 顾名思义,它可以更新约束。 例如,在单元格中,如果产品具有图像,则应通过将imageView高度限制为适当的高度来显示图像。 而如果产品没有图像,则imageView高度不应显示imageView。 imageView高度应为零。 重制约束 .updateConstraints更新特定的约束,并保持其他约束不变。 .remakeConstraints完全重新制作了约束,因为它将使用新约束并完全忽略旧约束。 动画制作 产品设计师向我发送了我必须制作的动画。 我必须将viewControllerA的contentCard稍微收缩到前台,并在屏幕底部同时模态显示一个子viewControllerB的contentCard。 制作起来很有趣。 动画还必须正确定时,有点挑剔。 首先,没有内置的方式来延长以模态方式呈现viewController的持续时间。 动画约束也可以伪造模态呈现。 UIView.animate可用于设置持续时间。 CustomizationsContainerView.snp.updateConstraints {contentCardContaineris的更新///顶部位置已更改并设置了动画,从而导致出现了模态演示。update.top.equalTo(contentCardContainer)} UIView.animate(withDuration:0.2,delay:0.1,options:[.curveEaseOut ],动画:{self.view.layoutIfNeeded()},完成:无) 轻按contentCard的关闭按钮,应将先前缩小的viewControllerA的contentCard放大到其原始大小,同时关闭viewControllerB。 func closeButtonPressed(){customizationsContainerView.snp.updateConstraints {update inupdate.top.equalTo(contentCardContainer).offset(view.frame.size.height)} UIView.animate(withDuration:0.3,animations:{//.identity设置contentCard返回其原始大小。self.contentCard.transform= .identity},完成:无)UIView.animate(withDuration:0.3,延迟:0.1,选项:[。curveEaseOut],动画:{self.view.layoutIfNeeded()},完成:nil)} 感谢您的阅读! 在这里阅读有关iOS开发实习生的第六周的信息 在下面通过👏表示赞扬您的支持,在Twitter上关注我的iOS开发者之旅,并在Twitter上与我联系 丽莎·姜(@imnotlostrui)| 推特 来自Lisa Jiang(@imnotlostrui)的最新推文。 #iOSDeveloper实习@fuzzpro //我希望改变世界…… twitter.com

关于值和引用类型的快速指南

Swift中的值和引用类型定义了如何在代码中直接传递变量或通过复制数据来传递变量。 它们的用法会极大地影响您组织和编写代码的方式。 值类型 值类型是不可变的,一旦设置就无法编辑。 对变量的任何更改都会导致该值类型的新实例。 如果使用诸如var i = 10类的变量,这似乎违反直觉,因为vars是可变的,但实际上,每次更新该变量时,我们都会创建一个新的内存中实例。 “ 值类型最基本的区别特征是复制-赋值,初始化和参数传递的效果-创建具有其数据唯一副本的独立实例 ”-Swift Blog 考虑以下代码: var testScore:Int = 80 var studentA.testResults = testScore testScore = 90 如果我们读出学生A的测试结果,我们期望他或她的分数为80。这是因为变量studentA.testResults设置了内存中有testScore的副本,而不是 testScore的实际实例。 将值类型分配给变量后,对其进行的任何更改均不会影响该变量。 像testScore这样的Integer使用值语义来实现此结果。 参考类型 引用类型是对象的共享实例,直接在代码中传递。 将其从一个变量复制到另一个变量时,它们都将访问相同的实例和数据。 因此,更改一个将影响另一个。 类TestResults {var score:Int?} var results = TestResults()var studentA.testResults = results var studentB.testResults = resultsstudentA.testResults.score = 95 studentB.testResults.score = 75 如果我们读出测验分数,则两个学生的测验分数均为75! 这是因为类是使用引用语义构建的。 学生A的测试结果引用了与学生B相同的results变量,因此当我们将分数更新为75时,两个学生均获得新成绩。 […]

Swift编程的优势是什么? – Alok Upadhyay –中

如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 Swift编程的优势是什么? Speed: 大多数类型是结构示例,例如Array,Dictionary,Set,String。 结构是值类型,由值传递,是多线程环境和内存安全(锁,互斥锁等)的不错选择 堆栈速度更快,因为访问模式使分配和释放内存变得很简单(指针/整数只是增加或减少),而堆的分配或释放则涉及到更复杂的簿记工作。 内存管理-对于ARC类和值类型,编译器将使用传统的基于堆栈的分配,就像使用C及其派生语言之类的大多数值类型一样。 枚举-如此丰富的枚举,具有函数,原始和值类型。 更少的Error-Prone:与Objective-C相比,Swift中的App崩溃明显更少, 因为大多数错误是在编译时捕获的,因此发生的运行时问题很少。 更好的语法:简单,类似于python,kotlin,JS。 类型推断—基于r值(如python)的自动类型检测。 类型安全性:严格键入的语言,较少出错。 比较python是动态类型语言 使用写时复制吗? ,我写兔子 Swift是功能,面向协议和面向对象的编程语言。 您不确定变量的初始值,请使用可选参数。 服务器端迅速发展,这是非常新的,也许在不久的将来我们会看到很好的。 扩展 :我喜欢它,在运行时将函数添加到现有类中。 开源:正确! 一个很棒的苹果社区,正在为此工作。 清单可以继续! 如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946