• 关于 Swift变量 的搜索结果

回答

PyObjC的主要用例是从Python访问Objective-C代码,但是可以使用PyObjC为Python中的ObjC / Swift应用程序实现某些功能。 充其量只是很少记载。有两种解决方法: 实现对插件包的支持,并使用python代码创建插件包(使用py2app进行打包)。这是在一个非常古老的PyObjC教程中记录的:https ://pyobjc.readthedocs.io/en/latest/tutorials/embedded.html 为应用程序添加对Python扩展的显式支持。 我会选择第二个选项,因为最终这是更容易实现的选项。 要到达那里,您需要做一些事情: 初始化python解释器并运行一些启动代码。请参阅“ Py_Initialize()”和“ PyRun_SimpleString()”以进行此操作(或有关在应用程序中嵌入Python的教程)。 确保在运行启动代码后释放GIL(嵌入时通常不需要此操作,但在使用PyObjC时尤其是在不同线程可能调用Python代码的情况下则需要这样做) 将ObjC API公开给Python 这可能是容易的,也可能是困难的,这取决于两个部分之间的接口有多复杂。将ObjC类暴露给Python很容易:只需使用“ objc.lookUpClass(classname)”即可在Python中访问ObjC类。这也会自动公开类上的所有方法。 方法访问可能需要做更多的工作,尤其是在该方法具有传递引用自变量或使用块的情况下。 可以访问全局变量和C函数,但是还需要进行更多工作,因为PyObjC无法从ObjC运行时API中读取它们。PyObjC文档包含有关如何在需要时访问它们的信息。 在代码的Python和ObjC部分之间建立链接。我将在Python中创建Python对象,然后添加ObjC API(使用PyObjC)将其传递给应用程序的ObjC代码。 为了在ObjC方面获得更好的体验,您需要在ObjC中定义将由Python代码实现的协议。 最后,请注意:所有这些都是为了从Python(而不是Swift)访问Objective-C API。这也应该适用于Swift代码,但前提是您必须在swift(@objc)中实现ObjC接口。PyObjC不能用于访问任意Swift API。

祖安文状元 2020-02-21 17:55:46 0 浏览量 回答数 0

问题

关于Swift中,界面传值的问题

爵霸 2019-12-01 20:15:41 892 浏览量 回答数 1

问题

Swift2.0到底「新」在哪?

忆远0711 2019-12-01 21:30:17 8367 浏览量 回答数 0

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

问题

Swift中的二维数组

保持可爱mmm 2020-02-08 11:59:35 1 浏览量 回答数 1

回答

Kotlin的简介 Kotlin是由JetBrains公司(IDEA开发者)所开发的编程语言,其名称来自于开发团队附近的科特林岛。 多平台开发 JVM :Android; Server-Side Javascript:前端 Native(beta) :开发原生应用 windows、macos、linux Swift与Kotlin非常像 http://nilhcem.com/swift-is-like-kotlin/ kotlin发展历程 image.png java发展历程 image.png JVM语言的原理 image.png JVM规范与java规范是相互独立的 只要生成的编译文件匹配JVM字节码规范,任何语言都可以由JVM编译运行. Kotlin也是一种JVM语言,完全兼容java,可以与java相互调用;Kotlin语言的设计受到Java、C#、JavaScript、Scala、Groovy等语言的启发 kotlin的特性 下面不会罗列kotlin中具体的语法,会介绍我认为比较重要的特性,以及特性背后的东西。 类型推断 空类型设计 函数式编程 类型推断 image.png 类型推断是指编程语言中在编译期自动推导出值的数据类型。推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。 在开发环境中,我们往往写出表达式,然后可以用快捷键来生成变量声明,往往都是很准的,这说明了编译器其实是可以很准确的推断出来类型的。编程语言所具备的类型推断能力可以把类型声明的任务由开发者转到了编译器. java中声明变量的方式是类型写在最前面,后面跟着变量名,这就迫使开发者在声明变量时就要先思考变量的类型要定义成什么,而在一些情况下比如使用集合、泛型类型的变量,定义类型就会变得比较繁琐。 Kotlin中声明变量,类型可以省略,或者放到变量名后面,这可以降低类型的权重,从必选变为可选,降低开发者思维负担。java10中也引入了类型推断。 Javascript中声明变量也是用关键字var,但是还是有本质区别的,Kotlin中的类型推断并不是变成动态类型、弱类型,类型仍然是在编译期就已经决定了的,Kotlin仍然是静态类型、强类型的编程语言。javascript由于是弱类型语言,同一个变量可以不经过强制类型转换就被赋不同数据类型的值, 编程语言的一个趋势就是抽象程度越来越高,编译器做更多的事情。 空类型设计 空类型的由来 image.png 托尼·霍尔(Tony Hoare),图灵奖得主 托尼·霍尔是ALGOL语言的设计者,该语言在编程语言发展历史上非常重要,对其他编程语言产生重大影响,大多数近代编程语言(包括C语言)皆使用类似ALGOL的语法。他在一次大会上讨论了null应用的设计: “我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我加入了null引用设计,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。” null引用存在的问题 以java为例,看null引用的设计到底存在哪些问题 空指针问题NPE 编译时不能对空指针做出检查,运行时访问null对象就会出现错误,这个就是工程中常见的空指针异常。 null本身没有语义,会存在歧义 值未被初始化 值不存在 也许表示一种状态 逻辑上有漏洞 Java中,null可以赋值给任何引用,比如赋值给String类型变量,String a = null,但是null并不是String类型: a instanceof String 返回的是false,这个其实是有些矛盾的。所以当持有一个String类型的变量,就存在两种情况,null或者真正的String. 解决NPE的方式 防御式代码 在访问对象前判空,但会有冗余代码;会规避问题,而隐藏真正的问题 抛出异常给调用方处理 方法中传参传入的空值、无效值,抛出受检查异常给上层调用方 增加注解 Android中可以增加@NonNull注解,编译时做额外检查 空状态对象设计模式 空状态对象是一个实现接口但是不做任何业务逻辑的对象,可以取代判空检查;这样的空状态对象也可以在数据不可用的时候提供默认的行为 java8 Optional类 java8中引入了Optional类,来解决广泛存在的null引用问题.官方javadoc文档介绍 A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (return a default value if value not present) and ifPresent() (execute a block of code if the value is present). 来看一下是如何实现的。 举一个访问对象读取熟悉的例子 java 8 之前 : image.png java 8: image.png 总结: 1.用Optional还是会比较繁琐,这个也说明了设计一个替代null的方案还是比较难的。 optional的耗时大约是普通判空的数十倍,主要是涉及泛型、使用时多创键了一个对象的创建;数据比较大时,会造成性能损失。 java8 引入Optional的意义在于提示调用者,用特殊类型包装的变量可能为空,在使用取出时需要判断 Kotlin的空类型设计 Kotlin中引入了可空类型和不可空类型的区分,可以区分一个引用可以容纳null,还是不能容纳null。 String vs String? String 类型表示变量不能为空,String?则表示变量可以为空 String?含义是String or null.这两种是不同的类型. 比如: var a:String = “abc” //ok var a:String = null //不允许 var b :String? = null //ok a=b // 不允许 String?类型的值不能给String类型的值赋值 这样就将类型分成了可空类型和不可能类型,每一个类型都有这样的处理;Kotlin中访问非空类型变量永远不会出现空指针异常。 同样上面的例子,采用Kotlin去写,就会简洁很多 image.png 编程范式-函数式编程 编程范式是什么? 编程范式是程序员看待程序和写程序的观点 主要的类型 非结构化编程 结构化编程 面向对象编程 命令式编程 函数式编程 这些类型并不是彼此互斥的,而是按照不同的维度做的划分,一种编程语言可能都支持多个编程范式 非结构化编程 第一代的高级语言往往是非结构化编程 比如 BASIC语言 每一行的代码前面都有一个数字作为行号,通常使用GOTO的跳跃指令来实现判断和循环. 看一下下面这段代码是做什么的: image.png 实际上做的是:程序在屏幕上显示数字 1 到 10 及其对应的平方 采用这种方式写程序,大量的使用goto实现逻辑的跳转,代码一长,可读性和维护性就比较差了,形成“面条式代码” 结构化编程 采用顺序、分支、循环结构来表达,禁用或者少用GOTO; 并用子程序来组织代码,采用自顶向下的方式来写程序 代表语言是C语言 实现同样的逻辑: image.png 可见采用结构化编程,代码的逻辑会更清晰。 面向对象编程 思想: 将计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。 特性: 封装性、继承性、多态性。 命令式编程 把计算机程序视为一系列的命令集合 主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 “先做这,再做那”,强调“怎么做” 实现: 用变量来储存数据,用语句来执行指令,改变变量状态。 基本所有的常见的编程语言都具有此范式 函数式编程 声明式语法,描述要什么,而不是怎么做 类似于SQL语句 语言: kotlin swift python javascript scala 函数是第一等公民 可以赋值给变量,可作为参数传入另一个函数,也可作为函数的返回值 纯函数 y=f(x) 只要输入相同,返回值不变 没有副作用:不修改函数的外部状态 举个栗子 公司部门要进行outing,去哪里是个问题,要考虑多个因素,比如花费、距离、天数等等,有多个备选地点进行选择。 定义一个数据类: image.png 要进行筛选了,分别用sql,kotlin,java来实现 找出花费低于2000元的outing地点信息 SQL image.png Kotlin image.png java 7 image.png 可见kotin的写法还是比较接近于sql的思想的,声明式的写法,而不管具体如何实现;其中的:place->place.money<2000 就是函数,可以作为参数传递给fliter这个高阶函数;而且这个函数没有副作用,不改变外部状态。 再来一个复杂一点的: 找出花费低于5000元,时间不多于4天,按照距离排序的outing地点名称 SQL image.png Kotlin: image.png java 7 image.png 由此可见用kotlin的函数式写法,会更简洁,逻辑也更清晰,这段代码的目标一目了然,这种清晰在于实现了业务逻辑与控制逻辑的分离,业务逻辑就是由函数实现的,比如place->place.money<500,而控制逻辑是由filter,sorterBy等高阶函数实现的。 而java的传统写法是基于对数据的操作,避免不了遍历的操作,业务逻辑与控制逻辑交织在了一起,这段代码的目的就不是那么容易清晰看到的了。 总结 kotlin是实用的现代编程语言,吸收了众多编程语言的优点,支持类型推断、空类型安全、函数式编程、DSL等特性,非常值得学习和使用。

问问小秘 2020-04-30 16:33:40 0 浏览量 回答数 0

回答

您应该对以下内容有些紧张==: struct NeverEqual: Equatable { } func ==(lhs: NeverEqual, rhs: NeverEqual)->Bool { return false } let x = [NeverEqual()] var y = x x == y // this returns true [NeverEqual()] == [NeverEqual()] // false x == [NeverEqual()] // false let z = [NeverEqual()] x == z // false x == y // true y[0] = NeverEqual() x == y // now false 为什么?Swift数组不符合Equatable,但它们确实有一个==运算符,在标准库中定义为: func == (lhs: [T], rhs: [T]) -> Bool 此运算符在lhs和中的元素上循环rhs,比较每个位置的值。它并没有做比较按位-它调用的==每个元素对运营商。这意味着,如果您==为元素编写自定义,它将被调用。 但是它包含一个优化-如果两个数组的基础缓冲区相同,就不会打扰,它只会返回true(它们包含相同的元素,当然它们是相等的!)。 这个问题完全是NeverEqual平等运算符的错。平等应该是可传递的,对称的和反身的,而这一平等不是反身的(x == x是错误的)。但是它仍然可能使您无意识。 Swift数组是写时复制的-因此,当您编写var x = y它时,它实际上并不能复制该数组,而只是将其x存储缓冲区指针指向y。只有在稍后更改x或时y,它才会创建缓冲区的副本,以使未更改的变量不受影响。这对于数组的行为类似于值类型,但仍然具有高性能至关重要。 在早期的Swift版本中,您实际上可以调用===数组(同样在早期的版本中,变异行为也有所不同,如果您进行了mutation x,y即使已声明为,也会改变let-吓坏了人们,所以他们改变了它) 。 您可以===使用以下技巧重现on数组的旧行为(除了依赖于戳和探查外,不依赖于实现,这完全依赖于实现)技巧: let a = [1,2,3] var b = a a.withUnsafeBufferPointer { outer in b.withUnsafeBufferPointer { inner in println(inner.baseAddress == outer.baseAddress) } }

保持可爱mmm 2020-02-09 13:53:15 0 浏览量 回答数 0

问题

如何在Swift中按数组元素分组

保持可爱mmm 2020-02-08 19:43:34 1 浏览量 回答数 1

回答

Swift 3删除了与>和比较可选选项的功能<,因此先前答案的某些部分不再有效。 仍然可以将可选参数与进行比较==,因此检查可选数组是否包含值的最直接方法是: if array?.isEmpty == false { print("There are objects!") } 其他可以完成的方式: if array?.count ?? 0 > 0 { print("There are objects!") } if !(array?.isEmpty ?? true) { print("There are objects!") } if array != nil && !array!.isEmpty { print("There are objects!") } if array != nil && array!.count > 0 { print("There are objects!") } if !(array ?? []).isEmpty { print("There are objects!") } if (array ?? []).count > 0 { print("There are objects!") } if let array = array, array.count > 0 { print("There are objects!") } if let array = array, !array.isEmpty { print("There are objects!") } 如果要在数组nil为空或为空时执行某些操作,则至少有6个选择: 选项A: if !(array?.isEmpty == false) { print("There are no objects") } 选项B: if array == nil || array!.count == 0 { print("There are no objects") } 选项C: if array == nil || array!.isEmpty { print("There are no objects") } 选项D: if (array ?? []).isEmpty { print("There are no objects") } 选项E: if array?.isEmpty ?? true { print("There are no objects") } 选项F: if (array?.count ?? 0) == 0 { print("There are no objects") } 选项C准确地记录了您用英语描述的方式:“我只想在nil或为空时做一些特别的事情。” 我建议您使用它,因为它很容易理解。这没有什么错,特别是因为如果变量为,它将“短路”并跳过对空的检查nil。 Swift 2.x的先前答案: 您可以简单地执行以下操作: if array?.count > 0 { print("There are objects") } else { print("No objects") } 正如@Martin在注释中指出的那样,它使用func > (lhs: T?, rhs: T?) -> Bool表示编译器将其包装0为,Int?以便可以与左侧进行比较,这是Int?由于可选的链接调用所致。 以类似的方式,您可以执行以下操作: if array?.isEmpty == false { print("There are objects") } else { print("No objects") } 注意:您必须在false这里明确地与之进行比较才能起作用。 如果要在数组nil为空或为空时执行某些操作,则至少有7个选择: 选项A: if !(array?.count > 0) { print("There are no objects") } 选项B: if !(array?.isEmpty == false) { print("There are no objects") } 选项C: if array == nil || array!.count == 0 { print("There are no objects") } 选项D: if array == nil || array!.isEmpty { print("There are no objects") } 选项E: if (array ?? []).isEmpty { print("There are no objects") } 选项F: if array?.isEmpty ?? true { print("There are no objects") } 选项G: if (array?.count ?? 0) == 0 { print("There are no objects") } 选项D准确地记录了您用英语描述的方式:“我只想在nil或为空时做一些特别的事情。” 我建议您使用它,因为它很容易理解。这没有什么错,特别是因为如果变量为,它将“短路”并跳过对空的检查nil。 分享改善这个答案 19年5月15日在14:24编辑 14年12月21日在11:39 回答 瓦瓦瓦玛 114k2222金币208208银章227个227青铜徽章 2

保持可爱mmm 2020-02-09 12:07:44 0 浏览量 回答数 0

回答

以下是我见过笑点比较高的: 1、 有看过这部剧的吗?推荐一下:《黑客军团》(Mr. Robot) 2、A man and woman are in a computer programming lecture. The man touches the woman's breasts. "Hey!" she says. "Those are private!" The man says, "But we're in the same class!" From Quora: 3、50 shades of Grey(五十度灰)讲的是什么: #272727, #282828, #292929, #2b2b2b, #2c2c2c, #2e2e2e, #313131, #323232, #343434, #353535, #373737, #393939, #3a3a3a, #3c3c3c, #3f3f3f, #404040, #424242, #444444, #454545, #474747, #484848, #4a4a4a, #4b4b4b, #4d4d4d, #4e4e4e, #505050, #515151, #535353, #565656, #575757, #585858, #595959, #5b5b5b, #5c5c5c, #5e5e5e, #616161, #626262, #646464, #656565, #676767, #6a6a6a, #6b6b6b, #6c6c6c, #6d6d6d, #6f6f6f, #727272, #737373, #757575, #767676, #777777, #7b7b7b, #7c7c7c, #7d7d7d, #7e7e7e, #808080, #818181, #838383, #868686, #878787, #888888, #898989, #8b8b8b, #8c8c8c, #8e8e8e, #919191, #929292, #949494, #959595, #979797, #9a9a9a, #9b9b9b, #9c9c9c, #9d9d9d, #9f9f9f, #a0a0a0, #a2a2a2, #a5a5a5, #a6a6a6, #a8a8a8. 4、 5、一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!” 程序员答:“加班。” 6、女朋友对着正在写代码的程序猿男朋友说:你又在写bug啦? 7、《c++程序设计语言》比《c程序设计语言》厚了几倍...果然有了对象就麻烦很多... 8、问:如何在Linux下生成随机串? 答:让新手退出Vim。 9、上大学那会,刚学会上网,于是在网上搜A片,然后搜出个:PHP大全.rmvb,以为是拍黄片大全,谁知道竟然是PHP的视频教程,于是我就学会了PHP……(╯-╰)/ 10、一对程序员情侣在一起的时候干什么? 答:面向对象编程。 11、问:怎么使用面向对象的方式变得富有? 答:继承。 12、程序猿的必读书籍: 第一阶段:《C语言程序与设计》《c++进阶宝典》《Swift入门与实践》 第二阶段:《教你怎么不生气》《老子》《沉默的愤怒》 第三阶段:《女装指南》 第四阶段:《颈椎病康复指南》《腰椎间盘突出日常护理》《强迫症的自我恢复》 第五阶段:《活着》 13、一个女程序员twitter上发了一条tweet: 昨晚梦见男朋友和别的女人在逛街,梦里我的第一反应是查源代码…结果调试半天查不出来为什么显示的是那个女人不是我,最后含泪把那个女人给注释掉了,再一运行就是我男朋友自己逛街了…醒来囧字脸呆了很久…囧rz 网友评论: 1、把那个女人的指针指向你即可 2、谁让你把男朋友设成public的? 3、加个断点看看那女人是谁 4、心真软,就应该把他的接口屏蔽掉 5、Protected逛街(youOnly) 6、设计问题,应该采用单例模式 7、没做回归测试 8、标准做法是做个断言 9、注释掉了,逛街的参数不用改吗? 10、最后含泪把那个女人给注释掉了,再一运行就是我男朋友自己逛街了-->很明显是变量名作用域的问题,改个名就行了 11、还可以有个多线程的算法,把你的优先级设成99,一个idle线程的优先级设成50,把那个女人的优先级设成49。酱紫就永远都调度不到啦 12、那也没关系,那就老调用那个女人。。。你BF放在那里不动。。。养着 13、上绝招,用goto,做个死循环,让他们逛死 14、善心点,别goto了,调用exit函数结束进程吧,冤冤相报何时了啊 15、查一下Log,仅仅只有逛街吗? 14、为什么程序员总是搞混万圣节和圣诞节? 因为 Oct 31 = Dec 25。(Oct既是十月October缩写,也是八进制Octal的缩写;Dec既是十二月December的缩写,也是十进制Decimal的缩写。八进制的31和十进制的25相等。) 15、某猿退休后决定练习书法,于是重金购买文房四宝。一日,饭后突生雅兴,一番研墨拟纸,并点上上好檀香。定神片刻,泼墨挥毫,郑重地写下一行字:hello world! 16、面试官:知道什么叫类么? 应聘者:我这人实在,工作努力,不知道什么叫累。 面试官:知道什么是包? 应聘者:我这人实在 平常不带包 也不用公司准备了。 面试官:知道什么是接口吗? 应聘者:我这个人工作认真。从来不找借口偷懒。 面试官:知道什么是继承么? 应聘者:我是孤儿没什么可以继承的。 面试官:知道什么叫对象么? 应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。 面试官:知道多态么? 应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系?? 17、 18、 你是哪一种? 19、 Tab or Space? 最后,我想说,年轻人你渴望力量吗?

有只黑白猫 2020-01-08 14:15:01 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播