Tag: Objective C

如何在Swift框架中导入Objective-C框架

在正常的快速项目中,我们将创建一个桥接标题,然后将我们的Objective-C框架导入该桥接标题中。 对于框架,您将需要创建一个自定义的swift模块。 假设您有一个名为MyFramework的Objective-C框架。 首先,将您的框架添加到项目中: 然后,您需要将聚合添加到项目和目标列表。 输入Objective-C框架的名称作为产品名称。 然后转到构建阶段> +>新建运行脚本阶段。 输入以下脚本: 确保将头文件的路径设置为Objective-C框架的头文件的路径。 您可以在这里找到:https://github.com/AnumQ/public_scripts/blob/master/module.sh 从方案列表中选择聚合的MobileFramework,以建立聚合的MobileFramework。 现在,我们必须将框架包含在我们的项目中。 为此,我们将MobileFramework模块添加到主项目(框架)的Target Dependencies中。 现在构建您的MyCustomFramework项目。 通过添加import语句,只需在swift文件中使用框架: 哇!

快速排序问题

好吧, 真的是一个小案例。 如果您要在上面烤我… 通过一系列不幸的事件,我最近意识到Swift的默认排序算法可能会产生不稳定的结果。 这不仅让我感到沮丧,而且令我非常恼火,即使从Swift 3开始 ,也没有默认的稳定类别可以使我们的生活更轻松。 通常,这样的事情不会打扰我。 实际上,在大多数情况下,我可能不太在乎这些事情。 但是,在这一特定的日子,这使我非常困扰。 时间压力和使数据排列不正确的费用高得离谱,这使我不得不迅速解决这个问题。 现在,我将假设许多阅读本文的人对“稳定”排序的含义没有丝毫的了解。 因此,我将以我理解的方式在下面进行说明: 仅当两个相等的待排序对象被算法单独处理时,排序才被认为是稳定的。 确实,开发人员只应关心排序列表的稳定性,前提是这样做的代价是不小的 。 老实说,我对自己感到有些失望。 我天真地认为sort()对于我们所有的用例都可以完美地工作,并且我不需要对数据排序进行过多的关注。 假设是“所有操蛋之母”。 分类问题与山丘一样古老。 它们非常普遍,甚至可能导致代码中似乎无法完全解决的错误。 如果您使用Swift的时间超过大约四秒钟,那么您可能在Swift代码中使用了sort()几次。 您是否对潜在的边缘案例足够重视? 在与我的团队讨论了四个字母并进行了“您为什么认为此错误发生的原因”的讨论之后,粗略浏览一下sort()的快速帮助面板会向我们发出警告,指出不稳定算法最有可能是我的问题的原因。 经过快速检查,我们一起证明了。 为什么要为我们吸? 我们碰巧正在使用的应用程序在很大程度上依赖于向客户提供准确的数据。 基本上,用户可以订阅服务,并且每月向他们收费,这些订阅也可以停止。 每当我们去查询用户的订阅历史列表时,这个问题就变得很丑陋。 我们希望对数据进行排序,以便将给定订阅的历史记录和父列表本身从最旧到最新进行排序。 由于后端仅知道的原因,订阅的状态会在99.999%的时间内明显地发生变化,例如,从“ 请求”变为“活动”到“ 已停止 ”。 但是,在最小的0.001%的时间内,状态将立即更改。 问题就出在这里。 因为我是按日期排序的,所以列表最终混乱了,因为其中的某些项目被认为是相等的,并且Swift的排序算法不稳定。 我的解决方案 现在,虽然我可能已经能够为sort()提供更多指标, 我选择立即使用更强力的解决方案。 由于Swift对我来说还是很新的东西,因此我选择了老旧的Objective-C解决方案。 让sortedArray =(parentList as NSArray).sortedArrayWithOptions(.Stable,usingComparator:({(lhs,rhs)-> NSComparisonResult在 let lhs =(lhs as!Record)//用您的数据类型替换 let rhs =(rhs as!Record)//与上面相同 如果lhs.date […]

UIWebView与WKWebView:¡migremos!

从WebView到iOS 2.0的最新一代HTML应用程序,从IOS 8.0到Apple,从WKWebView到另一种,从Ahora Bien到“ Cual es la diferencia? Bien,干草差异,2。Primero,UIWebView和UIKit分开,可替代的应用程序,可替代性的,不可替代的东西。 Tambiénquiere decirqueáestádisponible en界面生成器,从Podemos importarlo a nuestrosdiseños。 WKWebView可以根据需要在应用程序中添加适当的内容,无论是在Safari上实现最佳效果还是在Safari浏览器上都可以通过velos de lapágina上的网络高效地浏览,在sobretodo, menos备忘录中找到。 在UIWebView上使用常规的UIWebView可以“按比例缩放页面”,在WKWebView上不负责任,可是,siemprepodrásbuscar在SO como realizal算法中类似。 UIWebView在应用程序中的实际使用时,WKWebView的简单性和Nitro Javascript引擎的使用是不合理的,IOS8和Apple都应考虑将WebView的交互作用与Web上的交互是不合理的( UIWebView的用法 。 UIWebView的Estaprovete de esto社区,WIB WebView,y claro的hacerlo porcódigoya quetodavíano hay unelemento en el IB que WKWebView。 Es tanfácilde Implementar… WKWebViewConfiguration * theConfiguration = [[WKWebViewConfiguration alloc] init]; WKWebView * webView = [[WKWebView […]

内容物拥抱和内容物抗压缩性

自动布局使用约束的优先级来解决两个不同约束之间的冲突。 对于具有固有大小的视图,自动布局使用内容拥抱和内容压缩抵抗来解决冲突。 让我们考虑一个例子。 假设我们有一个固定的高度视图,其中有两个标签作为子视图,如下所示。 它可以是标题和内容标签。 标签具有固定的顶部和底部间距,并具有最高优先级。 观察下图,标签内容恰好适合可用空间。 标签的内在内容大小等于可用空间。 内容拥抱 让我们考虑另一个例子。 两个标签都有一行内容。 现在,标签必须超出其固有大小,才能满足标签的约束并适合视图内部。 自动布局是一个冲突。 它必须展开其中一个标签,但无法确定。 因此,它使用内容包含优先级来解决冲突并扩展其中之一。 我为第一个标签指定了最高的内容优先级,以防止其增长。 具有最低优先级的第二个标签会超出其固有内容大小,以容纳剩余空间。 内容拥抱优先级可以设置如下 titleLabel.setContentHuggingPriority(.defaultHigh,for:.vertical) subTitleLabel.setContentHuggingPriority(.defaultLow,for:.vertical) 也可以在情节提要中设置 耐含量压缩 考虑另一个示例,其中两个标签的内容都较大。 现在两个标签都无法在可用空间中显示完整的内容,它不得不缩小其中一个标签,但无法确定它。 自动布局是一个冲突。 因此,它使用内容压缩抵抗来解决冲突并缩小其中之一。 如果需要,我希望标题标签显示完整的文本,而内容标签缩小。 为标题标签设置更高的抗压缩性可防止其收缩。 耐内容压缩性可以如下设置 titleLabel.setContentCompressionResistancePriority(.defaultHigh,for:.vertical) subTitleLabel.setContentCompressionResistancePriority(.defaultLow,for:.vertical) 也可以在情节提要中设置它 今天就这些。 通过https://twitter.com/ideekshi与我联系

从Pod导入Objective C标头? 十分简单!

我是一名新的iOS程序员。 我距Swift已有3年了,所以我在iOS编程中的第一门语言是Swift。 尽管那里有很多库可以帮助我开发应用程序,但它不像Swift库那么简单,Swift库仅在“ pod安装”完成后无缝地导入其模块。 为了更清晰,在这里我谈论的是如何从通过Cocoapods注入的库中导入Objective C标头。 轻松将库手动注入到Swift项目中。 您可以将其文件从外部文件夹拖放到您的项目中,Xcode将为您提供为您生成Objective C桥接标头的选项。 或者,您可以创建一个新的Objective C头文件“ .h”,并将其命名为: -Bridging-Header.h 在我们开始之前,我想使它成为一个简单的教程,而不仅仅是有经验的程序员记住某些东西的方式。 这意味着,虽然实现起来很短,但是one line code ,但是我想分享一下我如何通过反复试验来理解这一点。 因此,像往常一样,让我们​​创建一个新的Xcode项目。 随意命名,忽略核心数据,UI测试和单元测试。 就像您每天一样,如果您每天制作一个新应用程序。 然后,我需要您至少知道如何使用Cocoapod。 如果您不知道Cocoapod是什么,那么花一点时间来了解iOS开发者社区为我们提供的如此出色的工具。 您将要访问其官方网站,该网站还提供了我们找到所需图书馆的方式。 前往http://cocoapods.org 新,我想您已经掌握了Cocoapod。 然后,我们将使我们的项目使用将从Cocoapod获取的外部库。 转到项目根文件夹,如果您不知道什么是根文件夹,则只需转到包含我们的。xcodeproj文件的文件夹。 在终端上运行pod init 。 Podfile Pod完成后,让我们打开Podfile声明要导入的Pod库。 让我们找到一个仅用Objective C编写的好的库。我的意思是,这个库在Swift中还没有或者没有。 我们有MagicalRecord,它将帮助我们管理CoreData的使用。 通过将pod ‘MagicalRecord’,’~> 2.3’放在…行的#Pods下pod ‘MagicalRecord’,’~> 2.3’将MagicalRecord声明为Podfile。 保存Podfile,然后在终端上运行pod install 。 我们将获得由pod发送的一堆日志,以告知我们项目中的当前操作。 等到完成。 现在,我们在根文件夹中具有。xcworkspace和.xcodeproj。 如果我们使用Cocoapod作为第三个库管理器,则每次处理项目时都希望使用.xcworkspace。 如果您想替代Cocoapod,我们可以选择Carthage和Swift Package Manager。 打开.xcworkspace。 我们的项目保持不变,只不过我们在Xcode导航器窗格中注册了两个项目。 一个是我们自己的项目,第二个是Pod项目。 这就是为什么我们需要使用xcworkspace来始终加载Pod项目的原因。 […]

如何以JPEG格式读取HEIC画廊照片

iOS11引入了HEIC作为高质量图像的新格式。 不幸的是,其他设备(例如PC)经常无法以这种格式渲染图像。 因此,建议在将图像提供给其他用户之前将其转换为JPEG。 一种选择是将HEIC文件上传到服务器,然后将文件在那里转换为JPEG。 尽管将文件直接从设备上传到S3或Azure Blob存储之类的云存储服务时没有任何中间处理,但这是不可能的。 对于这些情况,在设备本身上将HEIC图像转换为JPEG是最好的方法。 可以在Objective-C中完成以下操作: [[PHImageManager defaultManager] requestImageDataForAsset :obj 选项:选项 resultHandler:^(NSData * _Nullable imageData,NSString * _Nullable dataUTI,UIImageOrientation方向,NSDictionary * _Nullable info){ UIImage * image = [UIImage imageWithData:imageData]; mediaData = UIImageJPEGRepresentation(image,1) ; … 有关完整示例,请参见对cordova-gallery-api插件的以下提交。 编码愉快!

iOS面试问题(快速)-第1部分

Swift的优点是什么? Swift是Apple Inc.为iOS ,macOS,watchOS,tvOS和Linux开发的通用,多范式, 编译时编程语言。 可读性 -简洁的语法,使阅读和编写变得更加容易。 维护 -更少的代码和更少的旧版-一个文件.swift。 更安全的平台 -您可以在编写代码时编译并修复错误。 高速 —令人难以置信的快速,高性能的LLVM编译器将Swift代码转换为优化的本机代码,以充分利用其设备。 还对语法和标准库进行了调整,以使代码发挥最佳性能。 Swift支持动态库 开源的 2.解释类和结构之间的差异。 快速的类和结构之间主要有四个区别。 类具有以下结构没有的其他功能: 类型转换 :类型转换使您可以在运行时检查和解释类实例的类型。 引用计数允许对一个类实例进行多个引用。 (结构是值类型,类是引用类型。) 继承使一个类可以继承另一个类的特征。 使用反初始化程序 ,类的实例可以释放其分配的所有资源。 结构在您的代码中传递时总是被复制,并且不使用引用计数。 结构实例总是按值传递,而类实例总是按引用传递。 3.何时使用类和何时使用struct? 作为一般准则,请考虑在以下一个或多个条件适用时创建结构: 该结构的主要目的是封装一些相对简单的数据值。 合理的是,当您分配或传递该结构的实例时,将封装的值复制而不是引用 。 结构存储的任何属性本身都是值类型,也应该期望将其复制而不是引用。 该结构不需要从另一个现有类型继承属性或行为 。 在所有其他情况下,定义一个类,并创建该类的实例以通过引用进行管理和传递。 4.如何传递变量作为参考? 我们可以使用inout参数将变量作为参考传递。 inout表示修改局部变量也将修改传入的参数。 var值:字串=“ Apple” func changeString(newValue:inout String){ newValue =“三星” print(newValue) //输出:三星 打印(值) //输出:三星 } changeString(newValue:&value) 5.什么是swift模块? 模块是代码分发的单个单元。 […]

我爱Swift,我讨厌使用Swift

最近,我被问了很多以下问题:“为什么还要使用Objective-C?” 或“为什么不使用Swift?” 在Slack频道,Twitter,Podcasts上,所以我决定在我的Medium帐户上开设一个更详尽的答案,说明为什么我仍在使用Objective-C。 免责声明:我不是在这里说什么是对还是错,应该做什么和不应该做什么,我只是在阐述为什么Swift不适用于我 。 简介 最近,我们迎来了iPhone SDK诞生10周年的纪念日,这实际上使我意识到我已经使用iOS已有10年了。 在发布SDK的那一刻,我下载了它并开始使用Xcode,发布了一些应用程序,并在一两年后获得了我的iOS开发人员正式职位。 这就是说我对Objective-C感到很自在,而且当新技术问世时我也大肆宣传,并面临这样做的后果,这使我在开始使用新技术之前至少思考了3倍。科技火车。 迅捷的自己 首先要考虑的是Swift本身,它是一种语言。 好不好吗? 比Objective-C好还是坏? 这些都是复杂的问题,由于涉及很多个人喜好,因此很难客观地回答。 我喜欢它,我认为语法是好的,它用途广泛,并且易于阅读(这通常对开发人员本身造成的负担比对语言的负担更大)。 总的来说,我认为这是一种不错的语言,我真的很想更频繁地使用它,这是我将开始列出不这样做的原因的部分。 可怕的更新 这变得越来越不成问题了,但是Swift是一种新语言(2014年),与它初次出现的Objective-C相比,更新自然会很快(而且非常生气),并且会出现重大变化,新语法等,因此非常迅速。 1984年。每年,Swift更新都会破坏以前的代码,有时需要大量工作,有时需要简单的快速修复,但几乎像我的消遣方式一样,阅读有关Slack / Twitter的评论,人们对其项目未编译感到焦虑/紧张。使用某些库已更新到最新的Swift版本的库,而另一些则没有,必须管理所有这些库。 在Objective-C世界中不存在的问题。 几周前,我在Mac(iOS 4/5)上发现了一些非常老的项目,为了娱乐,我决定打开并尝试运行。 令我惊讶的是,一切正常。 讨厌的纹理和UI不能很好地老化,但是可以正常运行。 当然,获得一个有6年历史的项目并运行它不是一个非常常见的用例,但是,另一方面,我最近帮助了一位继承了Swift项目的朋友,除了项目本身,该项目在大约2年内没有更新。如果不进行编译,则所有依赖项也都已过时,其中一些依赖项从未见过新的Swift版本支持。 但是正如我之前写的那样,Swift越来越稳定,并且很快将不再是问题,但是直到今天,我仍然看到Slack上的人们由于Swift版本的迁移而遇到了问题。 尽管如此,如果这是我考虑在新项目中使用Swift的唯一问题,不幸的是,并非如此。 迅捷工具包 这就是我为什么不使用Swift的最大原因所在。 当我说“工具包”时,我指的是与Swift一起使用的所有东西,以拥有一个不错的开发环境:Xcode,LLDB,LLVM,Instruments等。 Xcode对Swift的支持几乎是可笑的,语法突出显示不起作用,编译时间非常长,缺少Swift重构,最重要的是,LLDB根本不起作用。 LLDB是我工作流程的重要组成部分,不仅用于调试,而且还用于实际编写代码,自动化流程,编写日志等。我写了一篇关于葡萄牙语使用LLDB的事情的帖子(葡萄牙语),但它们并没有在Swift中无法使用。 使用Objective-C,我可以使用调试器命令执行很多断点操作,有时我会使用LLDB表达式编写整个方法,然后对结果感到满意时,甚至对某些我喜欢使用的日志,都会对实际代码进行转录LLDB +断点操作,而不是NSLog。 现在您可能正在考虑“但是您可以在Swift中做所有事情”,我说“您不能”,这不是因为该功能不存在,不是因为LLDB在Swift中不存在,而是因为它们是超级越野车 。 一个简单的po命令几乎立即在Objective-C项目上运行,在Swift上,它最多可能需要4秒钟才能返回(在最大容量的2015 MacBook Pro上),而当它很幸运时,它就会变慢,因为更多通常,调试器连接只会丢失,而我知道解决此问题的唯一方法是重新启动Xcode 和模拟器。 我相信,这通常是许多对Xcode的抱怨的源头,我看到人们抱怨Xcode有错误,这种方法不起作用,我只是不能与此相关,而不是在我使用Objective-C时。 去斯威夫特还是不去斯威夫特? 总之,我认为Swift是一种很棒的语言,我可以在macGist这样的业余项目中自己使用它,这是一个很棒的示例,如果您想看到一个不熟悉Swift的人开发的Swift项目以及一个AppKit项目一个不了解AppKit的人,但是每次我打开一个Swift项目时,都要花几分钟的时间,直到我想念Objective-C世界。 不是因为语言,不是因为我的语言效率更高,而是因为该工具包可以正常工作。 有些人可能会发现过去,为了利用Swift的出色优势和性感的语法,我做不到。 我提到的所有这些问题,语言更新和工具包都不是Objective-C的问题,这对我来说很难证明更改的合理性。 我真的希望今年可以为Swift改进和优化新的开发工具,希望我可以使用Xcode而不会使代码完成或语法突出显示崩溃,我可以在LLDB上运行表达式而不必等待音高下降的等效时间。 在那之前,我将对所有我认为“关键任务”的东西都使用Objective-C。 我真的很喜欢Swift作为一种语言,但是Swift作为开发解决方案仍然不是我的节奏。

持续的iOS学习-第1部分(文章)

我想与大家分享我所订阅的网站,博客和新闻通讯 ,每天我都会学到有关iOS , watchOS , tvOS和OS X应用开发的新知识。 随意添加自己喜欢的。 http://swiftsandbox.io http://www.cimgf.com http://ios-goodies.com http://en.swifter.tips https://littlebitesofcocoa.com https://iosdev.tools https://www.natashatherobot.com http://appcoda.com http://iosdevweekly.com https://www.objc.io http://swiftdevweekly.co http://realm.io http://useyourloaf.com http://nshipster.com http://nsscreencast.com http://www.pomo.tv http://www.cocoawithlove.com https://www.skilled.io https://www.weheartswift.com http://www.sososwift.com https://www.mikeash.com/pyblog/ http://swiftdeveloperblog.com http://jamesonquave.com http://www.learnswift.tips

IOS开发人员高级面试问题

第1部分 什么是NSNotification? NSNotificationCenter对象(或简称为通知中心)提供了一种在程序内广播信息的机制。 NSNotificationCenter对象本质上是一个通知调度表。 addObserver:selector:name:object:或addObserverForName:object:queue:usingBlock:方法 2.委托和通知之间的区别? 代表就像电话一样,您可以知道哪个班级正在向哪个班级传递消息。 通知就像无线电广播一样,其中一个类别触发的通知不会被准备收听/捕获通知并相应执行操作的任何类别或所有类别接收。 3. NSRunLoop? NSRunLoop对象处理来自窗口系统,NSPort对象和NSConnection对象的源输入,例如鼠标和键盘事件。 NSRunLoop对象还处理NSTimer事件。 您的应用程序既不创建也不显式管理NSRunLoop对象。 每个NSThread对象(包括应用程序的主线程)都有一个根据需要自动为其创建的NSRunLoop对象。 如果需要访问当前线程的运行循环,请使用类方法currentRunLoop进行访问。 4.强,弱和保持周期? 这些是与内存管理引用计数和所有权有关的属性。 强属性:当任何对象A对其他任何对象B都有强引用时,则意味着A需要B通过将其引用计数加1 ..在内存中存在,而在相同情况下B对A的引用具有弱属性,则意味着A引用了A而不需要在内存中保存其引用计数。这样,​​它还可以管理保留释放周期。 5.如何使用核心运动/核心位置获取两点之间的估计时间? 使用CoreLocation,我们可以计算从一点到第二点所花费的时间。 在每个位置点的核心位置,我们也有时间戳记。 使用此时间戳,我们可以计算对象的速度。 6.什么是核心数据以及核心数据和SQLite之间的区别。 两者之间存在巨大差异。 SQLLite本身就是一个数据库,就像我们拥有MS SQL Server一样。 但是CoreData是一个ORM(对象关系模型),它在数据库和UI之间创建一个层。 它加快了交互过程,因为我们不必编写查询,只需与ORM一起使用,并让ORM处理后端。 对于大数据的保存或检索,我建议使用Core Data,因为它具有处理设备处理速度较慢的功能。 7. Nsurlconnection与nsurlsession? NSURLConnection组成基础URL加载系统的一组相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage及其同名NSURLConnection NSURLRequest对象被传递到NSURLConnection对象。 委托(遵从以前的非正式协议和协议)作为NSURLResponse异步响应,并且从服务器发送所有关联的NSData在将请求发送到服务器之前,先查询共享缓存,并且根据策略和可用性,缓存的响应可以立即透明地返回。 如果没有高速缓存的响应可用,则发出带有为任何后续请求高速缓存其响应的选项的请求。 在与服务器协商请求的过程中,该服务器可能会发出身份验证质询,该挑战可以由共享cookie或凭据存储或连接委托自动处理。 已注册的NSURLProtocol对象也可以拦截传出的请求,以根据需要无缝更改加载行为。 除了同义的类NSURLSession外,NSURLSession还引用了一组相互依赖的类。 NSURLSession由与以前相同的部分组成,包括NSURLRequest,NSURLCache等,但是用NSURLSession,NSURLSessionConfiguration和NSURLSessionTask的三个子类替换了NSURLConnection:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。 NSURLSessionTask是一个抽象子类,具有三个可直接使用的具体子类:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。 这三个类封装了现代应用程序的三个基本联网任务:获取数据(例如JSON或XML)以及上载和下载文件。 8.使用仪器,为什么要使用? 仪器用于检查内存消耗和其他原理图。 9.了解MVVM,VIPER和其他吗? 遵循https://auth0.com/blog/compare-mvvm-and-viper-architectures/ 10. Swift比Objective-C有什么好处? Swift更容易阅读。 Swift更易于维护。 Swift更安全。 Swift与内存管理统一。 Swift需要更少的代码。 […]