Tag: Swift编程

可解码的JSON解析—迅速的爱情故事

这些天哪个应用程序不解析JSON数据(可能是基于Firebase的应用程序)。 通过所有展开和错误处理,对JSON响应的解码会变得非常激烈。 借助Decodable协议,Swift使得开发人员最常见的任务变得简单,只需几行。 可以从外部表示形式解码的类型-Apple 可以将JSON对象或属性列表中的任何数据解析为符合标准的Struct或Class ,而不会造成任何麻烦。 优点 易腐烂是标准的,因此更多的人会知道如何使用它们,它将流行起来 具有一些不错的枚举用法,有助于提高代码的可读性 较小的代码 花费更少的时间编写和修改代码 解码数据(JSON或任何其他属性列表)时,catch块完成的错误处理 缺点 您可以通过反射实现所有这些新功能。 必须为所有子类实现另一个必需的init 仅支持Swift 4及更高版本 在我看来,利弊大于利弊,Decodable是一个轻松的赢家。 我建议经常使用它。 现在最重要的是,如何使用它!

iOS自动版面3

Merhabalar Auto Layout的版本3和版本。 Eğeröncekiikibölümedahaöncehiçdenk gelmediyseniz buyazıdanönceo ikiyazıyagözatmanızıtavsiye ederim。 iOS自动版面2 iPhone 10(NamıdiğerEKS)重装了。 medium.com iOS自动版式1 Tümbu cihazlarda tekilgörünümüyaratmak bu kadar zor mu吗? medium.com 界面自动生成器界面布局,“界面” IB(olakanılacaktır)(bkz:Dilekçebaşlangıcı) ŞimdiIB ile Auto Layouta由medönceöncekiyazılarımızdatasarımlarımızıhep kodüzerindenyaptık。 IB乌泽林德·比尔瑟勒·亚普丹·奥恩故事板vs密码亚帕林。 Hangisinin daha iyiolduğukonusunda birşeysöylemeyegerek dahi yok。 Projeden,tasarımdanvekişidenkişiyedeğişiklikgösterenbirşey。 Deneyimleyip onagörebiriniseçmekdahamantıklı。 Gelelim IB ile自动版式 kullanımına: 如果您的自动版式约束为tanımlayabiliriz。 Bir viewüzerindeiken control ebasıpdiğerbir view’asürükleyerek 大型视图控制tuşuylaberaber basarakdiğerview’asürüklüyoruzve 2视图arasındaolabilecektüm约束器aşağıdakigibikarbiışımızaçıkıyor。 界面生成器’ınotomatiktanımlamayapması zh_cn解决自动布局问题请重新设置为建议的约束,然后按IB’ye约束tanımlamasıbırakılabilir。 销ve对准工具bölümünden 约束条件添加了新的约束条件约束条件增加了约束条件。 […]

使用新的OpenWhisk调试器

无服务器计算的迅速普及也就不足为奇了。 隐式可伸缩性,事件驱动/自动数据处理,简单性,可重用性,可组合性和降低的成本只是无服务器编程模型开始兴起的几个原因。 人们有时会反对使用无服务器编程模型的一个论据是,由于无法将本地调试器附加到无服务器操作上,因此无服务器操作可能更难开发,但实际上,既然有了wskdb ,这不再是问题。 wskdb:OpenWhisk调试器 如果您还没有看到它,那么现在您可以wskdb ,它是新的/ Beta版OpenWhisk调试器。 它允许您在丰富的调试环境中调试本地计算机上的OpenWhisk操作,就像调试本地代码一样。 实际上,您实际上是在调试本地代码。 使用调试器时,您将附加到操作。 然后,对该操作的调用将重新路由到您的开发机,您可以在其中调试并进行本地更改。 调试完成后,您可以推送更改,或者只是断开连接即可清理重新路由。 您甚至可以调试序列中的特定操作。 假设您有一个由操作A,B,C和D组成的序列。您可以将调试器附加到这些操作中的任何一个上。 因此,如果我想调试动作C,则将其附加到动作C。调用序列时,将在OpenWhisk环境中执行动作A和B,然后将在本地调试环境中调用动作C,然后将动作D在OpenWhisk环境中执行。 您可以使用OpenWhisk调试器来调试Node.js / JavaScript,Swift或Python操作,它使您能够达到断点,单步执行代码,检查内存值等等。 查看此概述: 可用的命令是: 指令说明 列表,l列出可用的操作 cli使用CLI调试器(如果可用) 调用,我调用一个动作 检查,获取,检查OpenWhisk操作的详细信息 火,f扳机 附加,附加到动作 分离,动作分离 diff显示给定操作的待处理差异 p,发布对给定操作的未决更改 退出,退出,e,q退出调试器 clean,c清除调试工件 创建动作 删除删除动作 帮助,h ,? 打印此帮助文本 要调试动作,您必须首先运行attach命令–这将设置“管道”以能够调试您的动作。 一旦连接了调试器,就可以使用in invoke命令(像OpenWhisk CLI一样传递参数)。 在下面的屏幕截图中,您可以看到我如何附加和调用我的斐波那契操作(该操作会在斐波那契序列中生成数字): 这将启动调试过程。 对于JavaScript / Node.js操作,这将基于您熟悉的Chrome / Blink / Webkit / Node Inspector调试器,如下图所示。 这样就可以检查内存中的变量,设置断点,逐行执行代码等。所有这些都是非常有用的开发和调试工具。 […]

枚举与结构…

像保存属性和方法的类一样,枚举和结构也可以具有与之关联的方法。 这些类型在现代编程中非常方便。 枚举: 关键字枚举用于定义枚举数据类型。 枚举或枚举是一种数据类型,它允许您定义可能(相关)值的列表。 枚举名称应以大写字母开头(例如:枚举DaysofaWeek)。 枚举可以具有原始值或关联值。 我们将在以下两个步骤中进行介绍。 像类一样,枚举功能也可以通过确保标准协议功能来扩展。 具有原始值的枚举: 原始值可以是字符串,字符或任何整数或浮点数类型。 每个原始值在其枚举声明中必须唯一。 将整数用于原始值时,如果未为某些枚举成员指定任何值,则它们会自动递增。 如果为任何成员分配了任何原始值,则为其余成员分配的原始值将从该给定值开始增加。 使用init?(rawValue:)初始化程序从原始值创建一个枚举实例。 它返回与原始值匹配的枚举大小写或为nil。 具有关联值的枚举: 在以下示例中,尝试在不带切换大小写的情况下访问关联的值。 您会收到编译器错误! 我们可以在开关盒中访问它们。 差异:(来源:https://www.tutorialspoint.com/swift/swift_enumerations.htm) 结构(struct): 在快速编程中,结构是灵活的构建基块。 关键字“ struct”用于创建结构。 结构支持许多与类相同的行为,例如方法,初始化程序。 结构和类之间最重要的区别之一是,结构在代码中传递时始终会被复制,但是类是通过引用传递的。 这就是为什么我们只说结构是值类型,而类是引用类型。 当您创建一个结构实例,并将该实例传递给其他变量时,该结构被复制,最后将有两个结构对象。 如果与类相同,则该类实例的地址将被复制到第二个变量中。 如果您更改一个属性的任何值,则更改将反映在两个对象(属性)上。 如果使用结构,则更改仅发生一个实例。 与类的第二个不同之处是,结构会为其成员或属性提供默认的初始化程序。 甚至我们都可以在struct中编写我们的便捷初始化程序,以便更轻松地使用它们。 通过结构名称访问结构的成员。 注意(提示):如果我们在struct的扩展中编写我们的便捷初始化程序,则可以通过我们的便捷初始化程序或带有struct成员的默认初始化程序来初始化struct对象。

[iOS] Udemy 003:PhotoShareApp

在xcode中创建一个新项目 安装 Ostetso 点击“ SDK”->“下载Ostetso SDK v2.4” 解压缩“ ostetsoSDK_2.4.zip” 将“ ostetsoSDK_2.4”重命名为“ Ostetso” 将文件夹“ Ostetso”拖到xcode项目中 创建新文件: iOS->头文件->另存为“ OstetsoBridge” 编辑“ OstetsoBridge.h: #import #import“ Ostetso / Ostetso.h” 3.将Objective-C框架安装到Swift项目中 单击“照片共享”->选择标签“构建设置”->选择标签“全部”,“组合”: (1)搜索“链接器标志”->展开“其他链接器标志”->双击“其他链接器标志”->添加“ -ObjC” (2)搜索“ bridgin”->双击“ Objective-C桥接标题”->添加“ photoshare / OstetsoBridge.h” ->选择标签“构建阶段”: (1)将“ Ostetso.framework”拖到“链接二进制文件与库”中 (2)将“ Ostetso.bundle”拖到“ Copy Bundle Resources”->“完成”中 (使用空白应用成功运行:第一次提交) 初始化Ostetso 注册Ostetso 新增应用 在“类AppDelegate:”的末尾添加“,OstetsoDelegate” 在“ AppDelegate.swift”中的函数didFinishLaunchingWithOptions()中添加以下代码 Ostetso.setApplicationID(“ 0C04F2AE-4908-43AE-AB67-677F92014A88”,appKey:“ 9B1FB7CE-C44A-A105-DB10-F4E30F5C6C69”,useProductionEnvironment:false,委托:self) (通过Ostetso消息弹出窗口运行成功:第二次提交) 5.在ViewController.swift的函数viewDidLoad()中添加“ Ostetso.showGallery()” […]

在Swift中编写自定义模式匹配

您也可以在我的博客SwiftRocks中阅读此文章,这是一个凉爽的地方! 模式匹配在Swift中随处可见,您可能已经使用了无数次来解构和绑定值(如switch例)。 尽管常规的switch例是模式的最常用用法,但是Swift有几种类型的模式可以混合使用,甚至可以在switches外使用,从而产生真正的简短代码。 我特别感兴趣的一件事是模式匹配可以用于各种各样的事情。 乍一看,很容易将模式匹配视为简单的相等性检查: 开关80 { 案例100: // 案例80: //匹配,因为80 == 80 默认: 打破 } 鉴于此,您可能会认为case “eighty”这样的case “eighty”将无法编译,毕竟”eighty”和80甚至都不是同一类型–如果您现在尝试使用,确实会发生以下情况: 如果案例“八十” = 80 { //错误:类型为“字符串”的表达式模式不能与类型为“ Int”的值匹配 } 但这并不一定。 在开发项目时,您可能已经注意到某些类型之间具有特殊的交互作用,例如Ranges及其关联的类型: 开关80 { 情况0 … 20: 打破 案例21 … 50: 打破 案例51 … 100: //匹配,因为80位于51 … 100之内 默认: 打破 } 原因是~= 模式匹配运算符 。 这个运算符在常规项目中没有看到太多用处(您可能之前已经看到过,因为这个确切的例子是范围内的数字 ),但是在Swift中它在内部被大量使用,这正是用于确认case语句的内容。 在大多数情况下,运算符是用于进行相等性检查的简单包装器(例如Int示例),但是Range在针对自己的关联类型使用~=时,具有特殊的实现,可让其在模式匹配时具有以下自定义行为: 扩展名RangeExpression { […]

在Swift中实现编程语言-第2部分:语法-设计我们的第一语言

这是“用Swift编写编程语言”教程系列的第二部分。请务必阅读 第1部分 。 如本系列的介绍中所述,我们将首先创建尽可能最小的“实用”解释器之一,即我们自己的计算器,仅包括数字*,/,+和-。 不够激动? 不用担心,因为稍后,我们将把它用作我们自己的编程语言的基础。 为什么我们关心语法? 在接下来的教程中,我们实际上将使用3个核心模块来实现我们的解释器,每个模块都在自己的教程中。 词法分析器 :执行词法分析。 这是关于将输入的字符串转换为令牌列表,令牌的信息结构比简单的字符或单词还丰富。 解析:关于将令牌转换为称为抽象语法树的树结构。 主要功能(解释过程):该函数使用我们的Lexer和Parser创建抽象语法树 ,然后通过遍历它来“解释”输出。 在执行之前,我提到的所有步骤都不需要正式的语法。 但是我还是出于某种原因决定将本章包括在语法中: 当我学习计算机科学时,我发现关于形式语言的教科书很少能轻松地解释语法。 对我来说,他们对这个问题有太多的满足感,这反过来又使这个概念过于艰巨。 维基百科也是如此。 实际上,可以使用OysterKit和ANTLR4等工具从语法(半)自动生成前两个步骤(Lexer和Parser)的高度优化的实现。 因此,我发现有必要在我们开始手动实现此功能之前引入这些选项(不过,请保证,我发誓我会使其易于理解)。 “上下文”一词并没有太多上下文 在实现我们的计算器之前,毋庸置疑,我们必须从设计语言的结构开始。 为此,我们将为我们的语言创建上下文无关的语法 。 上下文无关的语法是一组生产规则,它们以给定的形式语言描述所有可能的字符串。 生产规则是简单的替代。 例如,规则 A⇒α 用α代替A (维基百科) 现在是一些定义的时候了: 非终结符是可以用其他符号代替的符号,例如“α”。但是,如果“A⇒α”是我们唯一的规则,则这意味着“α”无法用某些东西代替其他。 因此,它是一个终端符号。 但是,“上下文无关”到底是什么意思? 所谓“上下文”,是指符号在文本中出现的位置。 更具体地说,在特定符号之前或之后的符号。 可以根据上下文将语法分为两类:上下文无关和鼓声…上下文相关。 我发现区分两者的最佳方法是简单地比较两个示例。 每种类型一个。 请考虑以下两个语法: :: = 0 1 | 01 和… :: = 0 1 :: = 0 […]

Swift:使用NumberFormatter在Integer上添加分隔符

如果要将整数值分成由字符(即1.000、1 000 000)分隔的组,则需要使用NumberFormatter 。 什么是NumberFormatter? NumberFormatter是在数字值及其文本表示形式之间转换的格式化程序。 如何使用它 为了方便使用,我们将创建两个扩展文件,使我们能够在项目中全局使用它。 Formatter + Extensions.swift extension Formatter { static let withSeparator: NumberFormatter = { let formatter = NumberFormatter() formatter.groupingSeparator = ” ” formatter.numberStyle = .decimal return formatter }() } 使用groupingSeparator可以确定分隔符是什么。 在这种情况下,它是空格,但是您可以添加任何其他特殊字符(例如点或逗号)以使其为1.000或1,000。 Int + Extensions.swift extension Integer{ var formattedWithSeparator: String { return Formatter.withSeparator.string(for: self) ?? “” } } 接下来,我们将从上述扩展中调用静态变量withSeparator ,并创建一个名为formatterWithSeparator的新变量。 […]

兄弟,你甚至连SwiftLint吗?

遵循准则或样式代码约定编写代码应该是您的核心实践之一。 而且我知道有时是不自觉的,或者是因为匆忙中我们在这里到处都是小事:方法实现时间太长,代码行很长,双折行,逗号后没有空格, -> …之间没有分隔,今天,我将写有关SwiftLint的工具,该工具将在编写代码时帮助我们强制执行样式和约定。 SwiftLint是Realm的一种工具,大致基于GitHub的Swift样式指南,用于实施Swift样式和约定。 使用SwiftLint可以帮助您接受样式和代码约定,这将为您带来一些好处,例如: 您的代码将更加清晰易读 您的代码将更具可维护性和可扩展性 您的代码将易于测试和调试 您将在所有项目中保持代码一致性 SwiftLint将检查您的代码,并识别语法和样式错误。 您将能够轻松地识别出这些内容,因为在编写代码时,您会在Xcode中看到类似的内容。 您可以通过几种方式安装SwiftLint,但我个人很喜欢使用CocoaPods方式。 当您与团队合作时,它特别方便,并且是安装特定版本的SwiftLint的推荐方法,因为它支持安装固定版本而不是简单版本(Homebrew就是这种情况)。 要将SwiftLint与CocoaPods一起安装: 只需将以下行添加到您的Podfile中: 吊舱“ SwiftLint” 2.在Xcode项目中添加新的“运行脚本阶段”,内容如下: “ $ {PODS_ROOT} / SwiftLint / swiftlint” SwiftLint有超过75条规则,您可以在此处查看列表。 好处是,您可以控制启用或禁用哪个规则,并可以为给定规则设置警告和错误的阈值。 只需在项目目录中添加.swiftlint.yml文件即可。 您可以在这里看到更多信息。 仅供参考:您可以在此处看到我预定义的.swiftlint.yml文件。 启用代码中的禁用规则 如果要启用或禁用特定于行或文件的规则,则可以使用某些功能。 可以通过以下格式在源文件中添加注释来禁用规则: // swiftlint:disable [ …] 规则将一直禁用,直到文件末尾或短绒棉纸看到匹配的启用注释: // swiftlint:enable [ …] 也可以通过添加:previous , :this或:next来修改disable或enable命令,以仅将命令分别应用于上一行,本行(当前)或下一行。 // swiftlint:disable:next // swiftlint:disable:this // swiftlint:disable:previous 在这里查看更多。 资料来源和阅读建议: SwiftLint […]

Swift第一部分的闭包

如何创建没有名字的功能! 介绍: 闭包是swift最有用的未来之一。在这三部分的文章中,我将以现实生活中的例子从最基本的方面来解释闭包。 什么是闭包: 闭包只不过是没有名字的函数。它意味着闭包是一个没有名字的函数,用不同的语言来调用,就像:匿名函数,回调,lambdas等。 换句话说,闭包是自我包含的功能块,可以在代码中传递和使用。 在深入探讨闭包之前,我们先创建一个函数并将其转换为闭包。这使我们的概念更加清晰。 简单功能: 如果我们考虑功能和闭包,那么我们可以像这张图那样说明闭包和功能。 让我们讨论闭包语法。 基本语法: 关闭以大括号开头,以大括号结束。这是简单的关闭语法: {{argumentName:Type)-> ReturnTypein //声明和其他 // …… // ….. 返回} 这是闭包的基本语法,以大括号开头,而不是参数名称及其类型,比返回类型比关键字中的语句要大,并且比return还要大。 范例一: 闭包的另一个基本示例,参数取两个值并进行计算并将其返回。如果执行此闭包,则可以执行以下操作。 let result = clasureOne(10,50)//结果应为500 示例二: 该闭包采用两个字符串,并将其作为单个字符串返回给字符串。顺便说一句,此闭包也分配给closureTWo变量。 var fullName = closureTWo(“ Mahmudul”,“ Hasan”) // fullName变量现在获得了“ Mahmudul Hasan” 以不同方式创建: 我们知道Swift是一种类型 – 安全的语言,因此在函数或闭包中,我们需要定义每个变量或常量的类型,然后隐式或显式初始化它。对于此功能,我们可以通过多种方式创建闭包Let Start .. 这个addTwoNumber闭包我们在equal =之前定义类型,并从闭包头中删除类型,这样我们可以这样写。 我们可以省略标题的返回类型,也可以变得足够聪明以至于无法理解 现在我们也可以从主体中删除return关键字。 现在我们可以像这样写在一行 现在非常简写,而且非常简短 因此这里是一个有趣的swift闭包,了解它有两个变量并将其添加并返回变量addTwoNumber 。因为我们明确定义了它的类型。而swift的默认参数名称为$ 0,$ 1,$ […]