Tag: swift

Swift4和Xcode9将在您现有的代码中向您发出新警告,并在附近弹出…

Swift4和Xcode9将在您现有的代码中向您发出新的警告,在您调用Swift函数Objective-C函数的区域附近弹出。 例如,当初始化UIBarButtonItem并包含#selector(swiftClassFunction)时 。 别担心! 这里发生的是,您正在调用的Swift方法对于Objective-C函数而言并不是自动可见的。 我在初始化UIBarButtonItem时发现了这一点。 Init方法是从Objective-C派生的,因此当您使用#selector添加新的Swift函数时,Xcode现在对我们大吼大叫。 这就是@objc和@objcMembers起作用的地方……您可以同时使用两个选项,并且您决定要依赖于要设置的访问权限。 选项1)在您的Swift func()声明的开头添加@objc … @objc func rightBarButtonTapped(){} 这只会将此功能公开给Objective-C。 这可能是您根据自己的情况打开的所有内容。 选项2)将@objcMembers添加到您的类定义中… @objcMembers类ViewController:UIViewController {} 此选项将打开整个课程直至Objective-C。 如果您发现一些需要弥合的差距,这可能会更干净。 参考文献 问题明细-http://bit.ly/HackingWithSwiftWhatsNewInIOS11 隐藏警告-http://bit.ly/StackOverFlowHideWarning Swift Evolution票证— http://bit.ly/SwiftEVO-LimitingObjcInference

Swift入门:常量

在总体上开始进行Swift或iOS开发之前。 我想问一个简单的问题: “您为什么要成为应用程序开发人员?” 您对事物的运作方式着迷吗? 您是否想执行一个革命性的想法? 如果您知道如何编码,您是否相信可以找到更好的解决方案? 还是只是为了钱? 如果这是您要寻找的金钱部分,那么从长远来看,很容易使您失去动力。 您必须对自己想做的事充满热情。 您应该很好奇知道事情是如何工作的以及如何将整个想法转化为应用程序。 应用程序开发不是一项枯燥的工作,实际上,它是最具创造力的过程之一,并且每一步都令人愉快😃。 话虽如此,让我们开始为您提供最新形式(打字时为v4.2)的一些Swift优势。 先决条件 如果您有使用任何编程语言进行编码的经验,此博客将更加有趣。 哦,是的,您将需要一台装有最新Xcode的Mac。 但是,如果您没有Mac,请执行以下操作:http://online.swiftplayground.run/,它可以使您在任何地方运行swift! 因此,请转到xcode>开始使用游乐场,或者更好的方法是直接转到http://online.swiftplayground.run/进行学习和编码。 你好,世界! 众所周知,程序员遵循愚蠢的传统。 其中之一是编写hello world程序。 因此,Hello World的Swift 4.2语法就在这里! 打印(“ Hello,world!”) 就是这样! 那是一个迅速的完整程序! 容易吧? 现在让我们学习如何快速定义变量和常量。 常数 我们使用关键字let创建常量,并且常量的值只能分配一次。 就像是双AA电池,您可以使用一次。 让名称=“授予” 让luckyNumber = 7 令百分比= 90.4 我们还可以像其他编程语言一样在一行中编写所有内容: 让名称=“允许”,luckyNumber = 7,百分比= 90.4 好的,所以我上面写的三个语句很容易理解,但是这里有很多事情要做。 让我们解码: 您可以看到,我从未尝试将’name’定义为String或将’luckyNumber’定义为int或将’percentage’定义为double。 这是因为提供一个值有助于编译器推断其类型,这意味着当我定义let name =“ Amit”时 ,编译器会自动将’name’作为String类型。 这实际上是Swift语言的功能。 您可能已经观察到我以一种不寻常的方式编写了“ luckyNumber”,这是因为许多Swift编码人员更喜欢以camelCase的方式编写变量或函数的全名。 […]

Swift 4.2(Facebook应用)中的iOS应用中的选择性旋转UIViewController锁定

大多数初级开发人员都很难找到管理特定UIViewController方向的方法。 在本文中,我将通过协议扩展实现可重用协议。 让我们从AppDelegate.swift开始 不要用我的英语笑,英语不是我的母语。 感谢您的阅读。 资料来源: https : //gunnarhafdal.com/2017/01/selective-rotation-lock-in-ios-apps-with-swift.html

可变参数:

Swift函数介绍 函数是一起组织以执行特定任务的一组语句。 快速地,在定义功能之前使用“ func ”关键字。 定义函数后,我们可以通过其名称来调用它。 “ –>”用于分隔函数的参数和返回类型。 它允许我们在函数调用内传递局部和全局参数值。 我们也可以从函数中返回一个可选值,这将在项目构建阶段以多种方式提供帮助。 函数声明 -告诉编译器函数的名称,返回类型和参数。 函数定义 -提供函数的实际主体。 默认情况下,函数使用其参数名称作为其参数的标签。 如果愿意,可以在参数名称前给自定义参数标签。 在参数名称之前使用“ _”,不带参数标签。 快速,函数函数可以以Tuple的形式返回多个值。 元组的元素可以通过名称或数字来引用。 Swift函数可以嵌套。 嵌套函数可以访问在外部函数中定义的变量。 在swift中,函数是一流的类型,这意味着swift函数可以返回另一个函数作为其值。 一个函数可以将另一个函数作为其参数之一。 如果将闭包作为函数的最后一个参数传递,则可以将该闭包放在函数调用的括号之外。 在计算机编程中, 可变参数函数是接受可变数量的参数的函数。 函数参数在参数类型之后用… (三个句点字符)表示,可以作为数组访问它们的主体。 传递给可变参数的值作为适当类型的数组在函数体内可用。 例如,在函数体内可以使用一个具有numbers名称和Double…类型的可变参数作为称为numbers类型[Double]的常量数组。 InOut参数: 大多数参数将复制为值。 它们永远不会影响原始呼叫站点。 但是inout参数不同–它们共享一个内存位置。 我们通过将inout关键字放在参数类型的前面来编写一个in-out参数 。 输入输出参数具有一个值,该值传递给函数,由函数修改,然后从函数传递回以替换原始值。

ViewController生命周期| 迅速

ViewDidLoad:(VisãoCarregou) Chamado depois是一个风景如画的风景,ou seja,depois是一个风景画的instanciada。 Essemétodosóéchamado umaúnicavez durante todo tempo de vida da控制器。 Aqui todos os outlets,setosado,sendo assim,éréradecustomizá-los,com o texto,sombra,borda等。 Um bom lugar para puxar dados externos(BD,APIs),aondesóprecision fazer umaúnicavez。 迪卡: 您可以在tamanho da视图中查看façanenhum calculo,在estar sendo utilizado中使用por aindanãose sabe Qual设备,或在mesmo中访问orientação。 Geralmente补充了autoLayout的功能,并且精确,合理地查看了viewWillLayoutSubviews和viewDidLayoutSubviews。 *** Aviso: viewWillLayoutSubviews和viewDidLayoutSubviews,包括多个主题,不同动机,杜兰特或ciclo de vida da控制器,可在应用程序上进行适当性能测试的对象。 ViewWillAppear:(Visãovai aparecer) Chamado toda vez que a view vai aparecer na […]

Swift中的惰性序列及其工作方式

您也可以在我的博客SwiftRocks中阅读此帖子,最好在此处进行格式化! 诸如map和filter类的高阶函数的用法在Swift项目中非常常见,因为它们是简单的算法,可让您将广泛的构想转换为简单的单行代码。 不幸的是,他们并不能解决所有问题-至少不是在其默认实现中。 高阶函数很渴望 :它们立即使用闭包并返回一个新数组,无论您需要提前返回还是仅使用特定元素。 当性能很重要时,您可能会被迫编写专门的助手方法来避免高阶的急切性质: 让地址= getFirstThreeAddresses(withIdentifier:“ HOME”) func getFirstThreeAddresses(withIdentifier identifier:String)-> [地址] { //不使用.filter {}。prefix(3),因为我们需要早日返回 变量地址= [地址]() 用于allAddresses中的地址,其中address.identifier ==标识符{ address.append(地址) 如果addresss.count == 3 { 打破 } } 寄信人地址 } 幸运的是,Swift有一种使用高阶函数的方式,同时仍然保持了辅助方法的改进性能-可以通过lazy属性访问Swift标准库Sequences和Collections惰性版本。 这些惰性变体的工作方式与常规变体一样,但有一点不同:它们具有诸如map和filter类的方法的自定义实现,以使它们懒惰地工作-意味着实际的计算只会在需要它们的地方和时间进行。 let allNumbers = Array(1 … 1000)let normalMap = allNumbers.map {$ 0 * 2} //将映射整个序列,而不管您需要做什么。letlazyMap = allNumbers.lazy.map {$ 0 * 2} //这里什么也没有发生。print(lazyMap [0])//打印2,但是其他所有内容都保持不变! 尽管起初有些令人恐惧,但它们使您可以减少大多数for循环,并尽早返回单层。 […]

可空性注释:Objective-C现代化(第1部分)

对于iOS开发人员而言,Objective-C现代化确实非常重要。 它提供了更好的类型安全性,并改善了与Swift代码库的交互。 有关更多信息,请查看我的第一篇文章:了解Objective-C现代化。 首先,我们将讨论可空性注释,它们为何重要以及它如何工作。 背景 与Java等运行时错误语言不同,Swift和Objective-C都具有编译时错误的优势。 即使这些错误有时会令人讨厌,但编译时错误通过帮助我们追踪那些绝对会导致应用程序在运行时崩溃的愚蠢错误,为我们提供了巨大的优势。 尽管Objective-C出现编译时错误,但在涉及类型安全之类的某些问题时,它往往比Swift更宽松。 一个这样的示例就是它如何处理缺少值的问题: null (对于ObjC指针引用,为nil )。 在Objective-C中,您可以使用nil指针做一些事情,因为Objective-C将nil视为0 。 如果将消息发送到nil指针,则会返回nil (或其他类似的“falsy”值)。 在Swift中, nil在功能上等效于其他语言,例如C ++中的null 。 如果您尝试在nil上调用函数,则会得到如下异常: 致命错误:展开一个可选值时意外发现nil 因此,确定您的价值是否可以为零非常重要。 Swift中现有的Objective-C API Swift通过可选(可以为nil )和非可选(不能为nil )来实现这一点。 但是,直到几年前,Objective-C还无法表达这一概念。 因此,您的Objective-C代码: @property(非原子,副本,只读)NSString * email;-(BOOL)setUserEmail:(NSString *)email密码:(NSString *)password; -(BOOL)setUserImage:(UIImage *)图像; 将会翻译成Swift这样的东西: var email:字符串{get} func setUserEmail(_ email:字符串!,密码:字符串!) 函数setUserImage(_ image:UIImage!) 如果没有文档,此代码会造成混乱,因为所有这些函数都将nil作为有效的参数值,但尚不清楚nil是否应被接受。 另外,如果我们在Objective-C代码中传递nil,则不会出现Objective-C编译错误。 这可能不会导致崩溃,但是肯定是模棱两可的。 歧义很少是好的。 大规模的歧义是危险的。 随着Swift开始起飞,苹果公司开始使用自己的一些框架启用适当的Swift可选翻译.2015年3月,苹果发布了一篇有关Nullability和Objective-C的文章,向我们展示了我们如何也可以启用这种适当的翻译。 基本 核心是2个关键字: _Nullable和_Nonnull 。 […]

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]

每次调用的结果均调用n次

您可以在我的博客上阅读此帖子–>>> 此处 今天,我在Sash Zats的一条推文中遇到了这个问题:一个函数如何调用n次,并使用每个调用的参数作为上次调用的结果? 当然,假设我们要调用一个函数5次,则可以这样做: ///Adds 5 to a number func addFive(to number: Int) -> Int { return number + 5 } let result = addFive(to: addFive(to: addFive(to: addFive(to: addFive(to: 2))))) print(result) //27 但这就是我们真正想要写的吗? 救援标准图书馆 我做了一些研究,然后发现了Chris Eidhof的回应,其中提到了一种叫做UnfoldSequence的类型。 事实证明,标准库具有一个名为sequence(first:next:)的函数,可以执行此操作。 从文档中: 返回由next和first重复懒惰应用形成的序列。 为了完整起见,下面是整个函数签名: /// – Parameter first: The first element to be returned from the sequence. /// […]