admin
2023-08-08
面试题

Swift面试题

1.Class 和 Struct 的区别类是引用类型, 结构体为值类型结构体不可以继承值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝2.理解Swift值类型的写时复制只有当一个结构体发生了写入行为时才会有复制行为。在结构体内部用一个引用类型来存储实际的数据,在不进行写入操作的普通传递过程中,都是将内部的reference的应用计数+1,在进行写入操作时,对内部的reference做一次copy操作用来存储新的数据,防止和之前的reference产生意外的数据共享。swift中提供该[isKnownUniquelyReferenced]函数,他能检查一个类的实例是不是唯一的引用,如果是,我们就不需要对结构体实例进行复制,如果不是,说明对象被不同的结构体共享,这时对它进行更改就需要进行复制。3.defer的用法使用defer代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出错误,这段代码都将执行。defer 语句块中的代码, 会在当前作用域结束前调用。每当一个作用域结束就进行该作用域defer执行。func doSomethingFile{ openDirectory() defer{ closeDirectory() } openFile() defer{ closeFile() } // do other things }4.inout 输入输出参数函数参数默认为常量。试图从函数主体内部更改函数参数的值会导致编译时错误。这意味着您不能错误地更改参数的值。如果您希望函数修改参数的值,并且希望这些更改在函数调用结束后仍然存在,请将该参数定义为输入输出参数。您可以通过将inout关键字放在参数类型的前面来编写输入/输出参数。一个在出参数具有传递的值中,由函数修改的功能,并将该部分送回出的功能来代替原来的值。有关输入输出参数的行为以及相关的编译器优化的详细讨论,请参见输入输出参数。您只能将变量作为输入输出参数的参数传递。您不能将常量或文字值作为参数传递,因为无法修改常量和文字。当您将一个与号(&)作为变量传入in-out参数时,将它放在变量名的前面,以表明该变量可以被函数修改。注意:输入输出参数不能具有默认值,并且可变参数不能标记为inout。let temporaryA = a a = b b = temporaryA } // 参数a本身定义是常量,inout修饰,可以修改a的值 var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) print("someInt is now \(someInt), and anotherInt is now \(anotherInt)") // Prints "someInt is now 107, and anotherInt is now 3"

admin
2023-08-08
推荐文章

什么是真正的程序员?

这篇文章的原文来自:A Little Printf Story作者仿照《小王子》中的情节,通过小 printf 遇见的不同类型的程序员,最后悟出什么才是真正的程序员!文章略长但是耐心读完,你肯会受益良多,下面开始吧!第一章Tips:推荐看完整篇文章,再回过头看一遍第一章。我非常幸运出生在一个电脑和电子游戏还没有普遍的时代。所以我可以和我的小伙伴们一起玩耍,同时发明属于我们的游戏。我们十分会玩:用树枝做成 🏹️。我们可以用树枝做出任何东西,除回旋镖。因为你把树枝扔出去,你需要自己捡回来。(作者这个故事是活跃气氛吗?😓)当我们长大了,上面说的游戏变得很幼稚。你不能把一个松塔当成一个手榴弹,假装拥有神奇的魔法,当其他孩子觉得作为一个成年人很酷,你最终会迫于压力而长大,不过总的来说这也是一个非常幸运的童年。偶然的一次机会我接触了电子游戏和电脑,你可能想沉浸在这个虚拟的世界,这会毁了你。大多数电子游戏:你不能创造,只能反应,浪费你的时间。我在十多岁的时候,参加过即兴表演,在哪里我可以发挥我的创造性。我大学的专业是多媒体,但是我最终却从事编程的工作。因为我觉得编程太酷了!我可以发挥我的创造性,同时又可以挣钱!之后我做了我的第一个游戏。“这不是一个真正的电子游戏。"别人跟我说:“它只是一个 HTML 的表单,而且代码需要简化。”它花费了很多心思和时间,这一席话使我有些沮丧。但是,我意识到如果我想做出被人们认可的东西的话,我还需要学习更多知识。我需要学习真正的编程,从 GUI 工具里的 JS,转到更好的语言:像 PHP。所以我先学习了 JS,后来又去学习 PHP,但是一切并不是很顺利,其他人给我的建议去试试 Python。最后,我学习的是 Python(🎊我也是这样走上 Python 之路的🍻)。但是 Python 中高深一些的东西:lambda 和面向对象编程,让我云里雾里的。后来别人建议我去读一下《计算机程序的构造和解释》,因为它是编程的基础入门圣经。就这样,我知道了 Scheme,后来我又去学习 C 语言。因为大多数的程序员都会 C 语言,同时我旁听了我们学校的计算机课程,跟着他们一起学习。因为,真正的程序员都知道数据结构和数学,但是这些我只略懂皮毛。我开始读技术文章和书,因为程序员的知识更新太快。经过一段时间,我掌握了 Erlang,从而开始了我的职业生涯。(本文的作者写了一本:Erlang 入门书)。十分奇怪的是:我这个没有用 Erlang 做过任何生产级别的开发的人,却得到了一份教 Erlang 的工作。第二章所以我忙于到世界各地演讲、教别人,虽然我讲的这些事情大多都和编程无关,但是大家似乎都相信我是一个真正的程序员。一天,我结束了一个会议坐飞机回家,但是飞机晚点了。我愤怒的敲击着键盘,一个柔弱的声音打断了我:“你好,能请你给我设计一个系统吗?”我:“什么?”“请给我设计一个系统!”我对这个请求很惊讶,我环视四周发现一个渴望成为开发者的孩子。他叫 printf(主角闪亮登场),我觉得这个名字很傻,他的样子如下图:“我还不是很了解计算机,但是你好像是计算机方面的专家。我希望写一个 blog 程序,人们可以使用和访问它。求求你帮我设计一个系统!”这是个令人惊讶的请求,并且我已经二十多个小时没睡了,我不是完全理解他的需求。我告诉他做一个系统十分困难,我不知道他想要做什么,比如需要支持多少访问者、在哪里部署等等,所以我无法根据他提供的少量信息,设计一个合适的系统。“没有关系,给我设计一个系统吧。”所以我做了下面这幅结构图:他看了之后说:“不,这个系统还不够好,请给我再设计一个别的。”所以我又做了下面这个:然后我给他讲解这个系统的工作原理。我的新朋友 printf 十分礼貌地说:“这不是我想要的,它又太复杂而且好多东西都是我不需要的。”我感到十分不爽,我设计的这个系统考虑到了:冗余、监控、备份、缓存、负载、支付、故障转移、部署简单等等。我设计的这个系统都已经可以获得一份可观的咨询费用了!我已经失去耐心了,所以我就画了这个:我又告诉他:“这是你设计的系统,你要的系统在这个黑盒子里。”我希望这个滑稽的答案,可以打发他。但是他的回复让我十分惊讶:“这正是我想要的!”这就是我和小 printf 相识的过程。第三章过了一段时间,我知道了这个小鬼的编程水平。在他的代码仓库只有些小程序、网站的小 demo、琐碎的程序片段。都是些不值得一提的东西。之后他开始着手做一个需要很多模块的大型程序。这个程序需要 socket、磁盘读写、用到真正的数据库。当它第一次跑起来的时候,小 printf 十分兴奋。但是,这个程序还不够好。这个程序需要重构、更好的测试、文档、分析。它只运行了一段时间就崩溃了。然后一次,又一次的崩溃!程序的设置是错误的,日志不工作、磁盘速度不稳定、网络卡顿、bug、编码混乱、数据库需要清理、证书过期、没有异常处理导致问题找不到根源。更多内容,请阅读原文:https://hellogithub.com/article/ec1c37c4204b485bb9e41894a4a13671

admin
2023-08-08
开源书籍

快速上手 AI 理论及应用实战

该教程包含学习 AI 必备的数学基础,机器学习实战小项目、深度学习入门、自然语言通用框架 BERT 实战,以及大量数据集。原文链接: https://github.com/ben1234560/AiLearning-Theory-Applying

admin
2023-08-08
开源书籍

微软开源的入门级人工智能教程

这是一份完全免费、面向零基础人群的 AI 课程,为期 12 周共计 24 节课。你将学习到关于 AI 的历史、基本知识、主流框架、CV 和 NLP 等知识。原文内容:https://github.com/microsoft/AI-For-Beginners

admin
2023-08-08
开源书籍

从 0 到 1 数据库内核实战教程

该项目是 OceanBase 团队基于华中科技大学数据库课程原型,联合多所高校重新开发的、从零上手数据库的学习项目。它结构简单、代码简洁,不仅有文字讲解和视频教程,还有由浅入深的题目。通过理论+实战的方式,帮忙初学者迅速掌握内核模块功能和协同关系,提高工程编码能力,有助于在面试和工作中脱颖而出。书籍链接:https://github.com/oceanbase/miniob

admin
2023-08-08
独立开发者

国内独立开发者实践要点

本文所指的独立开发者属于自由职业者,自由职业者是不与用人单位建立正式劳动关系,又区别于个体、私营企业主,提供服务性劳动获取报酬的劳动者。独立开发者是自由职业者中提供开发作为直接或间接(例如开发产品来提供)服务的劳动者。大致概括为:一、不和公司签劳动合同;二、不注册公司;三、靠开发赚钱。去年十月辞职后,因为有比较长的一段时间不在国内,就暂时没找工作,做自己的东西也帮朋友做些项目。几个月后酬劳陆续入账,居然没有比上班时少太多,而且自由度大大提高。于是开始正式转为独立开发者,从更多渠道找项目来做。上一段概括的三点是独立开发者的条件。第一点最清晰,自由职业/独立开发当然是不正式受雇于特定公司。第二点主要是区分个人公司实体和独立开发者,本文讨论的是后者。第三点就模糊了,只能说本文避免讨论“开发了量化交易程序虽然不懂股票不过还是赚钱了”“一直宅在家里开发于是把其它房间租出去获得租金”这类和开发没有直接关系的谋生方式。我03年起从事做Web开发,写asp到php到python到现在的kotlin/go,前端主要是react。在北京创业的项目卖给了今日头条,来上海在各家4A主要开发数字营销相关的产品——DSP、SSP、DMP这些。离职前在一家SaaS公司做产品总监。所以我在市场上找开发岗一时没碰到特别合适的,也没有好的创业机会,这么看来做独立开发倒是顺理成章了。项目虽然比较杂但主要是Web为主,App做得不多,都是自己擅长的toB产品。本文记录的是比较通用的要点,不限定于固定平台(例如App)或固定行业(例如游戏)。也要考虑历史的进程去年年底到现在,大厂裁人加上因为危机感四处活动的开发者,搭配压缩预算的中小型企业,市场也有对应的反映。就我个人来说,项目反而是变多了。公司想做个新项目但内部开发成本太高,找独立开发者做个MVP。程序调优或是bug修复雇经验丰富的开发者太贵,找独立开发者帮忙。甚至外包公司觉得他们手里的项目部分功能雇佣专人成本太高,也会找独立开发者——类似这些为了成本控制做出的调整,让我保证了今年的收入。五险一金如果要考虑买房买车入户,五险一金是独立开发者第一个要解决的问题。有些城市可以个人缴纳,上海只对本市常住户口开放。要挂到朋友的公司或提供代缴的平台,类似无忧保、人人保这种。如果按照最低基数,公积金和社保加起来每月支出1851.21,4月起增至2026.18。报价/收款/合同独立开发者的议价能力有限,而且软件工程的成本、功能范围、时间点、质量,开发人员通常只确定第四个,报价基本都是甲方提。只有一些独立任务,例如部署、bug修复、特定内容的爬虫等是我来报价。因为报价上已经是甲方主导了,必须在收款上尽可能保护自己的利益。我的收款方式是5/4/1:签订合同收50%作为预付款,完成功能开发双方确认后收40%,项目结束一个自然月后收尾款。关系比较好的就5/5,方针都是尽可能先收到款。即使甲方真做得出“拷源代码找其它人继续开发”这种事,好歹收了一半的款。何况项目真正的开发量(修bug、体验优化等)都是在功能开发完成后的维护阶段,所以也没有吃亏。项目费用(报价)和费用支付方式(收款)都要以合同的方式确认。对于守信的人,合同起个提醒的作用。遇到老赖也是指望不上,我有笔不到10万的款,三月份判决,交了强制执行书,到现在都还没收到钱。不能想当然的认为签了合同就万事大吉。缴税个人开发者如果要开增票给客户,可以找地税局代开。先做临时纳税人登记,得到一个身份证号+01的税号,然后填写如下申请表:更多内容,请参考原文:https://dmyz.org/archives/1407

admin
2023-08-06
Swift

不透明类型

Opaque Type(不透明类型) 用在函数返回值上。所谓不透明的意思是,函数的返回值不需要指明具体的类型,只需指明它必须实现某个协议即可。Opaque type 用法以下例子中,先定义了Shape protocol, 随后实现了几种不同的Shape:protocol Shape { func draw() -> String } // 三角形 struct Triangle: Shape { var size: Int func draw() -> String { var result = [String]() for length in 1...size { result.append(String(repeating: "*", count: length)) } return result.joined(separator: "\n") } } // 正方形 struct Square: Shape { var size: Int func draw() -> String { let line = String(repeating: "*", count: size) let result = Array<String>(repeating: line, count: size) return result.joined(separator: "\n") } } // 可以将指定形状翻转 struct FlippedShape<T: Shape>: Shape { var shape: T func draw() -> String { let lines = shape.draw().split(separator: "\n") return lines.reversed().joined(separator: "\n") } } // 可以拼接两个形状 struct JoinedShape<T: Shape, U: Shape>: Shape { var top: T var bottom: U func draw() -> String { return top.draw() + "\n" + bottom.draw() } }接着,利用以上形状编写一个可以够造出梯形的函数,并且使用some关键字指明该函数的返回值是一个实现了Shape协议的不透明类型:func makeTrapezoid() -> some Shape { // 用一个三角形、一个翻转三角形、一个正方形 来构造出梯形 let top = Triangle(size: 2) let middle = Square(size: 2) let bottom = FlippedShape(shape: top) let trapezoid = JoinedShape( top: top, bottom: JoinedShape(top: middle, bottom: bottom) ) return trapezoid } let trapezoid = makeTrapezoid() print(trapezoid.draw())返回 OpaqueType 和返回 Protocol 的区别提供者角度: Opaque Type 要求函数只能返回一种类型OpaqueType 和 Protocol 在代码编写上有一个很大的不同,前者要求函数只会返回某种类型,而不会返回多种类型:func flip<T: Shape>(_ shape: T) -> some Shape { // 编译通过,因为只会返回 FlippedShape 一种类型 return FlippedShape(shape: shape) } func invalidFlip<T: Shape>(_ shape: T) -> some Shape { // 编译出错,因为这个函数既会返回 Square, 也会返回 FlippedShape if shape is Square { return shape } return FlippedShape(shape: shape) } func protocolFlip<T: Shape>(_ shape: T) -> Shape { // 编译成功,返回 protocol 的话,允许类型不一样 if shape is Square { return shape } return FlippedShape(shape: shape) }从函数提供者的角度去看,protocol 比 opaque type 更灵活一些。调用者角度: Opaque type 具有类型标识,而 protocol 没有Opaque type 与 protocol 相比本质上的不同在于 opaque type 保留了类型标识,而 protocol 没有。如果你希望让返回的类型支持 Self, associated type 等依赖类型标识的特性,那就需要使用 opaque type. 比方说下面的例子,在 Container 这个 protocol 中定义了一个 associated type:protocol Container { associatedtype Item var count: Int { get } subscript(i: Int) -> Item { get } } extension Array: Container { }因为 Container 当中包含 associated type, 因此它无法作为返回值:// 编译出错: // Protocol 'Container' can only be used as a generic constraint // because it has Self or associated type requirements func makeProtocolContainer<T>(item: T) -> Container { return [item] } // 编译成功 func makeOpaqueContainer<T>(item: T) -> some Container { return [item] } let opaqueContainer = makeOpaqueContainer(item: 12) let twelve = opaqueContainer[0] print(type(of: twelve))

到第
共7条

VaporDemo

Vapor provides a safe, performant and easy to use foundation to build HTTP servers, backends and APIs in Swift

友链

赣ICP备2021010021号-1
© 2023 swiftdo
Designed By swiftdo Powered By Vapor
Github