Tag: 编程

迁移到C ++中的CMake,并使其与Xcode一起使用

曾经写过一个Makefile吗? 糟透了 使用cmake与Xcode 10.1一起使用。 这里(https://mirkokiefer.com/cmake-by-example-f95eb47d45b1)已经是一个很好的指南-我们将在此处填写详细信息,并使其与Xcode一起使用。 具体来说,我们将构建一个动态库。 制作一个CMakeLists.txt文件,并将其添加到顶部。 cmake_minimum_required(版本3.1) 设置(CMAKE_CXX_STANDARD 14) 设置(CMAKE_CXX_STANDARD_REQUIRED ON) 设置(CMAKE_CXX_EXTENSIONS OFF) 其中设置了所需的版本以及C++标准。 为您的项目命名: 项目(myproject) 添加动态库的源文件: add_library(myproject共享src / file1.cpp src / file2.cpp) 然后安装目标: 安装(TARGETS myproject DESTINATION lib) 安装(文件包括/file1.hpp目的地包括) 安装(目录包括/目录1目的地包括) 第一行将库安装到/usr/local/lib ,接下来的两个将文件或整个目录安装到/usr/local/include 。 而已! 使用方法: mkdir构建 光盘制作 cmake .. //您现在在构建目录中有一个Makefile make //该库现在位于构建目录libmyproject.dylib中 make install //安装库和头文件 Xcode呢? 超级简单: cmake .. -GXcode 现在,您在构建目录中有myproject.xcodeproj ! 点击运行,它将立即ALL_BUILD (确保运行按钮旁边顶部的目标是ALL_BUILD […]

挑战部分1

AnagabyLópezde Lara 豪尔赫·卡罗 对我来说,这个项目有点困难。 这是一个新主题,但也面临着新挑战。 我喜欢从事这个项目,因为我学会了如何使用不同的x代码元素,并且使用颜色非常有趣。 这是我们的最终结果,我们做了不同的尝试,其中一些尝试出错了。 我们通过阅读手册多次并在一些同学的帮助下解决了这一难题。

Swift中的哈希协议

昨天我进行了一次关于集合的讨论,并提出了符合可哈希协议的类型的想法。 不久之后,我意识到我对可哈希协议的理解是有限的,因此我开始将我确实知道的信息拼凑在一起。 我知道一个协议类似于一个蓝图,因为它列出了一个人必须采取并遵守的职责。 我还知道,集合在无序集合中存储了相同类型的不同值。 我的猜测是,当我们在集合中使用自定义类型时,它必须符合可哈希协议,这意味着要被视为可哈希对象,需要满足许多要求。 无论哪种方式,我都无法深入了解可哈希协议的实际含义或它们在自定义类型中的使用方式,因此我开始进行一些调查。 我浏览了Apple的文档,试图弄清楚什么是可哈希协议,并希望能更全面地了解为什么在集合中使用它们。 苹果将hashable定义为“一种为整数提供哈希值的类型。”好吧,但是什么是哈希值?-通过进一步阅读,我发现哈希值由类型的hashValue属性提供,并且基本上是一个整数,即对于相等比较的任何两个实例,都是相同的。 综上所述, hashValue是具有以整数形式存在的hashValue的类型,可以在不同类型之间进行比较。 举例来说,我们有两个实例a和b 。 如果a == b ,则a.hashValue == b.hashValue ,但是具有相同hashValue两个实例并不总是相等的。 当我们遵守可散列协议时,我们还必须遵守平等协议,但是让我们一次采取这一步骤。 我们遵循可哈希协议,就像我们执行其他任何协议一样: 狗类:可哈希{ var uid:整数 变量名称:字符串 变量年龄:整数 init(uid:Int,name:String,age:Int){ self.uid = uid self.name =名称 自我年龄=年龄 } } 但是,当我们遵循可hashValue协议时,我们必须具有hashValue属性。 狗类:可哈希{ var uid:整数 变量名称:字符串 变量年龄:整数 var hashValue:Int { 返回uid.hashValue } init(uid,Int,name:String,age:Int){ self.uid = uid self.name =名称 自我年龄=年龄 } } […]

实时编码的艺术

人们经常将实时编码与灾难的后果联系起来。 出于这种信念,大多数演示者在演示过程中都远离现场编码,而倾向于幻灯片,因此很安全。 我从事演示文稿的现场编码已有十多年了。 我几乎所有的演讲都是现场编码会议。 实时编码确实需要一定的勇气和信心,但是如果执行得当,它可以创造奇迹。 在这篇文章中,我将讨论我在现场编码演示中学到的课程。 实践 这毋庸置疑,多练习,多练习。 实践是完美的,良好的实践无可替代。 您应该确切地知道您要演示的内容以及演示流程将如何展开。 即使您是该技术领域的专家,也请确保您练习演示文稿。 后备 备份正在运行的代码总是一个好主意。 希望您的现场演示会顺利进行,但是如果您忘记了某些内容,则始终可以查阅备用代码。 少量代码 这是一个出色的实时编码演示的本质。 没有人正在参加您的演讲以看到您输入文字。 确保键入少量代码以产生输出。 理想情况下,您只需输入4-5行代码就能展示演示的一部分或一部分。 卡住,继续前进 如果卡在无法正常工作的代码上,请查阅备份。 如果您无法在10秒内使用备份修复它,请继续。 不要站在观众面前尝试解决问题。 您尝试解决问题的每一秒钟对您的听众来说都是永恒的。 不接受请求 我不确定这在世界其他地区有多普遍,但是在休斯敦这很普遍。 有时,您会在谈话中遇到一个人,他会在您进行实时编码时不断要求您添加功能。 与这些人打交道的最好方法是,简单地告诉他们在谈话后即可使用该代码,并且他们可以自由地自己添加功能以作为练习。 以后的问题 有时,您有很多演示要演示,而您根本无力回答演示过程中的所有问题。 在这种情况下,最好在演讲开始前告诉听众成员您将在提问的最后,甚至在会议结束后都可以帮助您。 为世界末日做好准备 如果您的演示需要互联网连接才能正常工作,请确保您有某种备份,以防没有互联网连接。 通常,最好录制一小段正在运行的演示的视频,以防SkyNet破坏整个互联网。 在会话/演示期间进行实时编码并不容易。 这是没有多少人这样做的主要原因。 成功的现场编码会议需要特殊的技能,信心和勇气。 最后,我认为实时编码是一门需要大量实践才能发展的艺术。 您是否在演示文稿中使用代码? 我很想听听您的提示!

Swift 5中的排他性实施

每次我们为变量设置值或从变量读取值或将参数传递给函数时,都会访问内存。 发布模式中排他性强制对Swift项目的影响 Swift 5中的排他性实施可能以两种方式影响现有项目: 如果项目源违反了Swift的排他性规则,并且Debug测试未能执行无效代码,则执行Release二进制文件可能会触发运行时陷阱。 崩溃将产生一条诊断消息,“ 对…的访问重叠,但修改需要排他访问 ”。 源代码级修复通常很简单。 内存访问检查的开销可能会影响Release二进制文件的性能。 在大多数情况下,影响应该很小。 结论 排他性强制仅捕获单线程错误。 对内存的独占访问可带来更可靠的性能,并显着优化: 图书馆 编译器 用户编写的代码 通过在发布版本中启用完全排他性强制实施,Swift 5有助于消除错误和安全性问题,确保二进制兼容性以及启用将来的优化和语言功能。 参考文献 https://swift.org/blog/swift-5-exclusivity/ https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md https://developer.apple.com/videos/play/wwdc2017/402/ 您可以通过Twitter,Linkedin,Facebook和Github与我们联系。

Swift解决方案:Flyweight模式

Swift Solutions是涵盖设计模式的一系列文章。 在每篇文章中,我们讨论该模式是什么,何时应用以及如何以Swifty方式实现它。 飞量模式是一种节省内存的模式,当有许多要实例化的对象共享相似性时使用。 在本文中,我们将说明并编写Swift中的flyweight模式。 阅读本文之后,您将知道在必须创建大量相关对象时如何节省内存。 插图 首先,让我们使用文本编辑器的经典示例。 文本编辑器实例化并重复使用所有26个字母。 例如,当键入“ HELLO WORLD”时,我们将在三个不同的时间重新创建“ L”字符。 这很浪费,因为我们创建了三个字符对象来表示相同的字母。 flyweight模式的目标是共享可重用的对象,而不是不必要地复制它们,从而使我们的文本编辑器轻巧。 我们通过首先将对象分为两部分来重用对象:外部状态和内部状态。 外在的是指对象的根据上下文而改变的部分,因此无法共享。 例如,一个字符可能被加粗,着色或具有较大的字体大小。 这类数据不可重用,因为我们不希望给定字符的所有实例都共享这些属性。 另一方面,固有数据表示跨字符保持相同的内容。 固有数据的一个示例是给定字符的形状。 所有重复的字符都是渲染的形状,并且该形状不会从一次出现更改为下一次出现。 每当角色出现在我们的整个作品中时,我们都可以使用相同的“ L”形,然后对其应用外在属性。 总结一下: 内部数据是不可变的,相同的,没有上下文的,因此可以重用。 外在数据是可变的和上下文的,因此,并非在所有情况下都可以重用。 通过分离内部数据和外部数据,我们能够确定我们可以在对象中重用的内容。 考虑到这一点,让我们跳入代码示例。 实作 我们将在我们的代码中模拟一支装满步兵的军队。 我们还可以有弓箭手,将军和许多其他类型的士兵,并且我们想尽可能地重复使用,因为这些士兵实体中的每一个都会大量存在。 protocol Soldier { func render(from location: CGPoint, to newLocation: CGPoint) } 首先,我们创建一个Soldier协议,该协议具有将士兵在网格上的原始位置以及士兵将要移动到的新位置的功能。 我们代码的目标是随着战斗的进行在网格上绘制步兵部队。 由于每个士兵都有一个唯一的位置,因此位置被认为是外部状态。 Flyweight对象不会存储位置,但是它们仍需要通过其功能输入来处理外部数据。 不久之后会更多。 飞行重量 让我们看看Flyweight对象的外观: class Infantry: Soldier { private […]

雨燕数据

Tipe data merupakan salah satu hal yang penting sekali untuk di mengerti di luar kepala。 Kenapa,karna semua berawal dari situ ketika kita memprogram。 Kita harus benar-bear memahami apa tipe数据来源,bagaimana mengolahnya,dan bagaimana menggunakannya。 内置于Swift的yang ada的Berikut tipe数据: // 整数 var myInteger:Int = 1 //双 var myDouble:Double = 1.23456 //浮动 var myFloat:Float = 1.23 //字串 var myString:String =“世界你好!” […]

Swift中的字符串,字符和性能-深入探讨

扫描令牌所用时间的三分之二全部花在了用于Character类型的初始化程序中。 到底是怎么回事? 初始化程序的第一个参数标签提供了一个小提示: _builtinExtendedGraphemeClusterLiteral 。 注意单词“ literal”。此初始化程序不用于从我要遍历的字符串中提取Character值; 它用于从源代码中其他地方的文字文本创建Character值。 在nextToken下找到这些标记的唯一地方是我的令牌生成器的switch/case模式。 他们真的造成那么多的开销吗? 我们可以让Swift编译器使用-emit-sil选项发出“规范SIL”(Swift中级语言),以更仔细地了解如何将这些case模式编译为较低级的代码。 (我在存储库中包含了一个小脚本,该脚本可以执行此操作,并且还可以分解Swift符号。)让我们找到与匹配逗号字符的case模式对应的SIL(为简洁起见,重新格式化了行号和范围): %448 = string_literal utf8“,” %449 =应用%26(%448,%23,%24,%25): $ @ convention(method) (Builtin.RawPointer,Builtin.Word, Builtin.Int1,@ thin Character.Type)-> @owned字符 %449的第二行和第三行所示的方法签名%449其放弃,但我们可以通过查看值%26来确认它,该值是被调用的函数: %26 = function_ref @ Swift.Character.init( _builtinExtendedGraphemeClusterLiteral:Builtin.RawPointer, utf8CodeUnitCount:Builtin.Word, isASCII:Builtin.Int1)-> Swift.Character : $ @ convention(method)(Builtin.RawPointer,Builtin.Word, Builtin.Int1,@ thin Character.Type)-> @owned字符 这是什么意思呢? 这意味着, 每次通过扫描循环(即,针对字符串中的每个字符)时,Swift都会调用此初始化程序来创建case模式中的每个字符,以便将当前字符与该模式进行比较,直到找到匹配项为止;并且该初始化程序如果您习惯于字符类型实际上只是一个数字代码单元的语言,则它的成本将大大超出您的预期。 通过查看Swift标准库源代码,我们可以看到将字符串文字(例如”,” )转换为Character时发生的动作序列: 编译器将UTF-8编码的文字表示形式嵌入可执行文件的数据段中。 在使用文字的地方,Swift调用Character.init(_builtinExtendedGraphemeClusterLiteral:utf8CodeUnitCount:isASCII) , Character.init(_builtinExtendedGraphemeClusterLiteral:utf8CodeUnitCount:isASCII)其传递步骤1中嵌入的字符串数据的地址(源)。 反过来,此初始化程序在String上调用相同的初始化程序。 最终,分配了StringBuffer […]

Swift中的正则表达式

从更一般的意义上讲,正则表达式是我们在学校中学到的东西,但是它们经常出现在编程任务中,尤其是在处理文本时。 关于Stackoverflow有一个问题,询问有关识别段落中文本的子集的问题。 问题的前提是要预览新闻文章,其结尾包含整篇文章中剩​​余的字符数,例如[+6025个字符]。 目的是用显示“更多”的超链接替换该字符计数文本? 我首先想到的是,我们需要使用正则表达式在方括号之间找到文本。 然后,我们将文本替换为所需的文本,最后,我们需要添加文本属性,尤其是超链接。 哎呀,这似乎有很多事情要做,所以让我们一次一步。 Swift没有正则表达式类,因此您认为您需要使用来自objective-c世界的NSRegularExpressions ,但是,这是错误的。 Swift字符串会自动桥接到NSString ,这意味着String具有一些不错的功能,使我们能够轻松地(通过正则表达式)对String执行模式匹配。 最好的例子是NSString类的range(of:options:)方法。 该方法在字符串中搜索字符串,但是选项使它真正强大。 有少数可用的选项,例如不区分大小写,向后且正则表达式感兴趣。 这些选项是不言自明的,也许是正则表达式除外,它会将搜索字符串视为“与ICU兼容的正则表达式 ”。 太好了,我们只需要定义一个正则表达式并将其传递给方法range(of:options:) ,它将告诉我们是否存在匹配项以及找到文本的Range 。 现在,我们只需要创建一个用于输入的正则表达式即可。 定义正则表达式完全是另一回事。 如果您曾经在SO或现实世界中看过任何东西,它们很快就会变得非常复杂。 regexr.com是一个很好的参考站点,您可以在其中测试表达式并获得有关构造表达式的详细信息。 让我们花一点时间描述一下我们如何构造正则表达式模式。 我们将在这里采用介绍性方法,仅介绍一些基础知识。 如果我们要在字符串中搜索字母a ,则正则表达式将只是一个仅包含“ a”的模式。 同样,如果我们要按特定顺序搜索特定字符(例如cat ,则模式将为“ cat”。 这一切都很好,但是出于我们的目的,我们需要找到方括号[ ]以及这些方括号之间的所有文本。 我们需要一种更强大的模式。 输入元字符,即在正则表达式模式中具有特殊含义和功能的字符。 一些最重要的元字符是点. ,问号? ,星号* ,脱字号^ ,括号, ()和方括号[] 。 让我们快速回顾一下这些字符在正则表达式中的含义。 的. 表示基本上匹配任何字符,但换行符除外。 这对于我们的目的将是有用的,因为这就是我们想要放在方括号之间的任何字符。 方括号[]表示要匹配一个字符类,这表示要在方括号之间匹配几个字符中的一个。 例如,将您的模式定义为[if] ,它将在输入“ Swift”匹配i找到匹配项( i或f将是匹配项),以及在“ wit”或“ half”上匹配的项i和f分别。 您通常会看到这与字母[az]或大写[AZ]匹配,对于数字字符则为[0–9] 。 […]

>>按位移位(swift 3)<<

高级运算符“ <>”用于快速将整数位移位给定的次数。 向右移一点具有将整数减半的效果,而向左移则使整数加倍。 例如: //右移 让example1 = 8 >> 1 // example1 == 4 让example2 = 8 >> 2 // example2 == 2 //向左移动 让example3 = 8 << 1 // example3 == 16 让example4 = 8 << 2 // example4 == 32 要了解移位的情况,我们首先需要了解整数如何用二进制表示。 在此示例中,我将使用一个无符号的8位整数来演示其工作原理。 了解UInt8 我在示例中使用的是UInt8,因为它很容易理解,因为我们不处理负数和仅8位。 注意 :拥有带符号的整数基本上意味着二进制签名中的一位被用来表示整数是正数还是负数。 意味着我们只剩下7个位来定义一个数字。 这使移位变得更加复杂。 在无符号整数中,所有8位都可用于定义数字。 用8位数字表示一个数字意味着我们可以表示256种不同的可能性(0–255)。 0 = 00000000 […]