Tag: 目标C

持续学习曲线(2018年8月)

8月1日,星期三 在MVC中的视图控制器之间共享状态(第2部分) 8月2日,星期四 参考周期和所有权 选装件 8月3日星期五 平等的 建立表单库:简介 SQL —基本培训 构建Swift代码 将Objective-C类迁移到Swift:零碎的方法 8月6日星期一 构建表单库:简化IndexPath逻辑 快速提示:使用compactMap构建数组 加快Swift编译时间 8月21日,星期二 扑 气压测量 星期三八月22 建立一支优秀的工程团队:第一部分-从您开始 有效的远程通讯 PSPDFKit内部 切换到站立式办公桌 8月23日,星期四 时间表 星期五八月24 改善Xcode工作流程的提示 适用于开发人员的最佳开源工具 iOS的入门库 8月27日星期一 先进的iOS编程概念—真的是“高级”吗? iOS程序员纪律的重要性 快速文章改变了我的生活 如何在Xcode中轻松找到未使用的Swift代码 颤动-我的想法和印象-第一部分 亚搏体育app 让我们来谈谈建筑 错过其他 流利 星期四八月30 打字稿 Heroku 星期五八月30 溅 The Swift by Sundell通讯 MySQL事务 重构时,您是否在使用小步骤? 实施编码类型的自定义关键策略 真正杀死大多数创业公司的是什么 建立一支优秀的工程团队:第三部分-招聘 Arty […]

边框与边界[备忘]

框架:根据Superview的坐标系 自己(view)相对于superview的位置及大小。 边界:以局部坐标系表示 自己(view)相对于自己的位置和大小,也就是如果没有去重设bounds大小,座标永远是(0,0) 创建view1和view2 view2的x = 0,y = 0取决于view1 2.改变界限 3.您可以更改的其他外滩 源代码 数据来自 https://medium.com/@mikru168/ios-frame%E5%92%8Cbounds%E7%9A%84%E5%8D%80%E5%88%A5-a425d3eea4d2 https://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center iOS开发CGRectInset,CGRectOffset等对比整理– 51CTO.COM 框架指的是:该视图在父视图坐标系统中的位置和大小(参照点是父亲的坐标系统)。界限指的是:该视图在本身坐标系统中的位置和大小… mobile.51cto.com

与Objective-C Swift代码兼容

(本文最初是用俄语撰写的,并在此处发布。) 尽管Apple已向我们提供了有关如何在Objective-C应用程序中使用Swift代码的详细文档(反之亦然),但在此方面还远远不够。 当我需要为Swift框架提供与Objective-C的兼容性时,Apple文档提出了更多问题,然后给出了答案(或者至少留有很多空白)。 密集的搜索证明该主题的照明效果很差:有关StackOverflow的几个问题和一些介绍性文章–这就是我所发现的全部。 本出版物是对找到的信息和我自己的经验的概括。 所描述的所有方法并不能声称是一个很好的实践,它们只是提供了一种解决问题的方法。 TL; DR。 为了在Objective-C中使用Swift代码,必须牺牲一些Swift功能,并为原始的Swift代码编写一个包装程序,该代码将不使用不兼容的功能(例如结构,泛型,枚举关联值,协议扩展等)。 所有包装器类都必须继承NSObject。 开始 因此,我们有一个基于Objective-C的项目以及一些想要在其中使用的Swift代码模块。 例如,它可以是在CocoaPods的帮助下添加的Swift框架。 像往常一样,我们向Podfile添加依赖项,运行pod install ,打开xcworkspace文件。 要使Swift框架可见,就不需要使用整个模块(就像我们在Swift中所做的那样)或单个文件(就像我们在Objective-C中所做的那样)导入。 必须导入的是一个名为-Swift.h的文件-这是自动生成的头文件,该文件是Objective-C代码与Swift公共API之间的连接链接。 看起来像这样: #import“ YourProjectName-Swift.h” 在Objective-C中使用Swift类 如果您可以立即使用Objective-C中的某些Swift类或方法,那么您很幸运:有人为您解决了兼容性问题。 事实是,Objective-C仅消化NSObject继承者和属性的公共API,初始化程序和方法必须由@objc属性标记。 处理自己的代码时,您始终可以继承所需的任何内容并添加任何属性。 当然,在这种情况下,您甚至可以用Objective-C编写,对吗? 因此,最好专注于他人的代码。 我们可以做什么? 写包装纸。 例如,考虑以下Swift类: 公共类SwiftClass { 公共功能swiftMethod(){ //此处执行。 } } 我们创建自己的Swift文件,导入外部Swift模块,创建NSObject继承类,并在该类内部创建想要的Swift类型的私有属性。 最主要的是一个通过属性调用原始Swift类型方法的方法: 进口基金会 导入SwiftFramework 公共类SwiftClassObjCWrapper:NSObject { 私人让swiftClass = SwiftClass() @objc 公共功能swiftMethod(){ swiftClass.swiftMethod() } } ( NSObject和@objc属性都可以从Foundation获得。) 显然,我们不能使用相同的名称。 但是我们可以使用原始名称将包装器API公开给Objective-C: @objc(SwiftClass) […]

持续学习曲线(2018年5月)

5月3日,星期四 iOS工程工作流中的即时反馈 无需越狱即可浏览应用程序 使您的iOS应用更安全的5个步骤 与一个巨大的Xcode项目进行角力 MVVM-C中的C 向TensorFlow推出Swift 如何树立设计眼 我们如何在Shopify组织(一些)UX团队 纸线框如何使您成为更好的设计师 如何将数据源和委托移出视图控制器 智能手机如何处理庞大的神经网络 MVVM和VIPER之间的界线模糊 改善智力并变得更聪明的最佳方法 MVVM-MVC正确完成 添加缓存 动画UIWindow的rootViewController过渡 为什么带有关联值的Swift枚举不能具有原始值 优步工程博客 用代码创建视图 在Swift闭包中捕获对象 5月4日,星期五 为什么我要离开硅谷 键入的通知(第1部分) 键入的通知(第2部分) 协议和类层次结构 深度学习变得简单 工程师三天不开会的时间表 5月7日,星期一 介面 发现和比较技术栈 5月8日,星期二 突变无类型词典 所有代码都是一次性的,就像应该的那样 Twitter最佳iOS技巧:3月和4月版 Swift中的函数式编程:充分利用代码 5月9日,星期三 降低难度 使用工厂在带有自定义主题的Swift中创建干净且可重用的视图 使用Swift进行Web开发 数组,数组切片和集合 Moishe Lettvin-我在Google进行250次面试时学到的知识 14分钟内Google I / O 2018主题演讲 Waymo 10分钟内Google I / O 2018主题演讲 5月10日,星期四 […]

从Objective-C到Swift的过渡

我已经为Objective-C编码了很多年了,对此感到非常满意。 我很高兴将代码放在方括号中。 在Apple在iOS 5.0上引入ARC之前,我什至设法处理了所有我们不得不使用的保留和发布内容。 也许这就是为什么我推迟了我作为Swift开发人员的出场时间。 现在,我们已经将项目迁移到Swift,我看到了这么长时间以来我所缺少的所有收获。 但是,在过渡过程中必须将两种语言结合在一起时,并不是所有事情都变得容易。 这篇文章将涵盖在此过程中做出的一些决定和遇到的问题。 迭代和增量方法 我们的PromoFarma iOS项目是在VIPER架构下使用Objective-C构建的,该项目将所有实现隐藏在协议中,以实现层边界和交互。 有很多资源讨论了干净架构的许多好处,但是我想强调一个: 层隔离 。 这种层隔离使我们能够逐层计划过渡。 从功能角度来看,一次转换每个图层实际上是一种迭代和增量的方法。 我们能够一次面对一个问题,并且在测试过程中只需进行较少的更改即可测试每个功能。 还应该指出,由于这种方法,我们不断地定期发布版本。 快速发挥潜力:Objective-C合规 为了遵循增量过程,我们将所有层边界协议都保留在Objective-C中 。 这样,所有的Objective-C代码都可以基本保持完整。 当然,这意味着所有新的Swift代码都必须符合Objective-C并必须符合其协议。 因此,第一个Swift实现无法利用其某些功能,例如结构,元组,泛型或高级枚举。 这样做的好处是,它帮助我们遵循了最初的迁移计划。 零或不零 在Objective-C中进行编码时,会冒着习惯将nil视为可使用的有效值的风险。 是的,当不应该为nil 值为 nil ,应用程序不会崩溃。 但是,除非您进行处理,否则它也不会按预期工作。 关于Swift的一件好事是,它迫使您在编码时决定一个值是否可以为nil 。 因此,确定所有内容的可空性会使整个迁移比仅将一种语言翻译成另一种语言慢一些。 但是最终,它变成了一个更可靠的应用程序。 再见Mantle和AFNetworking 迁移从实体层开始,因为它是最简单且依赖程度较低的实体 ,这是第一个大问题。 我们使用的是Mantle ,感觉就像将它保留在Swift中就像是逆流而上。 因此,我们决定实施Swift的内置Codable协议,这是第二个大问题。 当我们在数据层中使用AFNetworking时,对可Codable对象进行反序列Codable的过程并不简单。 然后我们尝试了一下,开始使用Alamofire迁移数据层 。 在中期,这是一个不错的决定,但是迫使我们稍微改变增量方法,并同时迁移实体和数据层 。 它不仅是语言翻译,还必须对每个文件进行一些更改。 扩展…无处不在的扩展 在这两层迁移之后,下一层就很简单了。 不仅因为Presenter,Interactor和Routing层非常简单,而且还因为团队对语言本身有了信心。 值得注意的是,尤其是在Presenter层中 ,我们已经能够按照其所遵循的每个协议在扩展中组织代码,从而提供了很多代码可读性和更好的组织性。 你好泛型 从我作为Android开发人员的经验中,我在Objective-C中一直想念的一件事就是通用类型。 […]

在MacOS应用程序中嵌入Python

通过pyinstaller将python应用程序嵌入MacOS可可应用程序中 用于macOS核心的Mosaic Shapes用Python编写。 该UI用Objective-C编写,并通过NSTask和NSPipes与嵌套的Python应用程序进行通信。 由于产生的沙箱约束和代码签名问题,花了很多时间,咒骂和深夜才弄清楚如何将Python应用程序嵌套在Cocoa应用程序中。 我找不到在线全面的解决方案来解决我的问题。 我希望本演练对将来在搜索Google搜索结果的人中有所帮助。 从pyinstaller生成.app并将其嵌套在XCode中之后,通过NSTask调用python应用程序很简单。 但是,一旦准备好将应用程序提交给商店,就需要正确设置应用程序的沙箱权利并对该应用程序进行代码签名。 这就是噩梦通常开始的地方。 从这里下载python 2.7.13: https://www.python.org/downloads/ 下载pyinstaller: http://www.pyinstaller.org/ 一旦将应用程序沙箱化,MacOS的默认出厂python版本和Python的Hombrew / Cellar版本将出现代码签名问题。 嵌套python应用程序后,使用适当的沙盒权利对其进行签名,然后尝试调用您的python应用程序后,就会显示该错误。 您将收到崩溃消息,该崩溃消息给出了引用Python的古老代码签名错误。 (堆栈溢出)。 确保直接从python.org下载Python安装程序。 就我而言,我正在使用2.7.13(尚未使用Python 3进行测试) 下载并安装后,仔细检查默认的Python: guppy:〜dean $哪个python /Library/Frameworks/Python.framework/Versions/2.7/bin/python guppy:〜院长$ python -version Python 2.7.13 如果您使用的安装方式不是默认的python解释器,则可以明确指定要在python virtualenv中使用的python版本 mkvirtualenv -python = /库/框架/Python.framework/版本/2.7/bin/python 现在,打包您的python应用程序(替换为您的参数): python pyinstaller.py run.py -icon = icon-windowed.icns -clean -windowed -onefile -osx-bundle-identifier“ com.mosaic.mosaicshapes” 注意 :请确保您已经准备好图标文件,否则pyinstaller将默认使用其自己的图标。 此外,将包ID替换为父应用程序的包ID。 将生成的应用程序嵌入XCode […]

60面试问题每个iOS开发人员都应该知道。 (第1部分)

在这第一篇博客文章中,我试图介绍有关ObjectiveC的简单问题。 所有问题的答案均​​来自多个来源。 如果您对以下任何问题有更好的答案,请将其作为评论发送。 (此博客的版权归所有在多个博客,QnA网站和Apple Developer文档中提到这些答案的开发人员所有) 1.解释什么是Objective-C协议。 协议声明了任何类都可以选择实现的程序接口。 协议使通过继承关系远的两个类彼此通信以实现某个目标成为可能。 在这里阅读更多。 2.解释协议的类型。 正式协议声明了客户端类应实现的方法列表。 正式协议具有自己的声明,采用和类型检查语法。 您可以使用@required和@optional关键字来指定其实现是必需的还是可选的方法。 子类继承其祖先采用的正式协议。 正式协议也可以采用其他协议。 正式协议是对Objective-C语言的扩展。 非正式协议是NSObject上的一个类别,它隐式地使几乎所有对象都采用该协议。 (类别是一种语言功能,使您可以将方法添加到类中而不对其进行子类化。)在非正式协议中实现方法是可选的。 在调用方法之前,调用对象将检查目标对象是否实现了该方法。 在Objective-C 2.0中引入可选协议方法之前,非正式协议对于Foundation和AppKit类实现委派的方式至关重要。 3.解释什么是#import。 #import确保文件只包含一次,因此您不会遇到递归包含的问题。 4. Objective-C中的#import和#include有什么区别? 导入是包含的超级集,它确保文件仅包含一次。 这样可以避免递归包含。 关于“”和。 在本地目录中搜索“”,<<用于系统文件。 5,Objective-C中类别的用途是什么? 通常,您可以使用类别将方法添加到现有类中,例如Cocoa框架中定义的方法。 所添加的方法由子类继承,并且在运行时与类的原始方法没有区别。 您还可以使用自己的类的类别来:将自己的类的实现分发到单独的源文件中-例如,您可以将一个大类的方法分组为几个类别,然后将每个类别放入一个不同的文件中。 声明私有方法。 #import“ SystemClass.h” @interface SystemClass(类别名称) //方法声明 @结束 6.类别的局限性和问题? 优点:您可以扩展没有源的任何类,甚至那些类。 例如,查看Apple添加到NSString类的UI扩展,以进行渲染,获取指标等。由于您可以访问所有实例变量,因此类别为您提供了一种使用逻辑在跨编译单元的结构化代码的好方法分组,而不是例如Java采取的“必须全部在一个物理位置”进行分组。 缺点:您不能安全地覆盖该类本身或另一个类别已经定义的方法。 7.说明何时使用NSArray和NSMutableArray。 哪一个更快且线程安全? NSArray及其子类NSMutableArray管理称为数组的对象的有序集合。 NSArray创建静态数组,NSMutableArray创建动态数组 在这里阅读更多。 8.什么是快速枚举? 该对象通常是诸如数组或集合之类的集合。若干个Cocoa类(包括集合类)采用NSFastEnumeration协议。 您可以使用它来检索实例持有的元素,其语法类似于标准C for循环的语法,如以下示例所示: NSArray * […]

วิธีการติดตั้ง

netfox —一个轻量级的单行设置iOS / OSX网络调试库! 🦊 ทำiOSมาได้เกือบสองปีละแต่ก่อนเวลาจะดู请求,响应งใช้องใช้Charlesซึ่งต้องต่อWi-Fi,ยวกัน,ตั้ง代理,信任证书วุ่นวายพอสมควร CharlesCharlesี้นiOSแล้วนะให้สิทธิ์แก้ไขการตั้งค่าของเครื่องไม่ต้องตั้งค่าอะไรวุ่นวายแต่ต้องซื้อแยก ดีอดีinอtools toolsอ工具มาตัวนึงชื่อว่าnetfoxทางสว่างก็เกิดขึ้นเลยมาบอกต่อสามารถใช้ได้ทั้งiOSและmacOS applicationนะครับ ซึ่ง工具ตัวนี้ผมว่าดีในมุมของการ调试เองและลดงานระหว่างdevและtesterเช่นนtesterสามารถดูได้เลยว่า请求,响应ถูกต้องหรือไม่ก่อนที่จะมาหาiOS devและถูกไล่ให้ไปหาAPI dev (ฮา)และไม่ต้องเสียบสายดูLogcat(นั่นมันAndroidตะลึงตึงโป๊ะ) Giากตรงนี้ไปก็ข้ามไปดูในGithub https://github.com/kasketis/netfoxได้เลยหรือจะอ่านต่อก็ได้ 椰子纲 ใช้ายมากถ้าcoรใช้ cocoapods ลืมPodเข้าไปตัวนึงที่ Podfile ได้เลยอย่าลืม user_framworks! ด้วย use_frameworks! pod’netfox’ pod install าร pod install ให้เรียบร้อย 迦太基 ใช้รือถ้าใครใช้迦太基ก็ใส่ลงไปใน Cartfile ว่า github“ kasketis / netfox” ็จแล้วก็ carthage update –platform iOS –cache-builds ได้เลย(อย่าลืมปรับ命令ดูได้ที่https://medium.com/@phai/84cf004cb35c) 应用程序代码应用程序代理功能应用程序完成FinishLaunchingWithOptions 迅速 อย่าลืม import netfox NFX.sharedInstance()。start() 目标C [[NFX […]