Tag: 扩展

今日扩展:得分小部件

分数小部件是可重用的组件,可用于通过“今日扩展”显示任何游戏的分数和其他详细信息。 使用Today Extension扩展您的容器应用程序,即使您的手机被锁定,也可以让用户参与其中。 让我们看看如何使用这个很酷的小部件。 首先从下面提到的GitHub存储库下载ScoreWidget的zip文件。 pallavtrivedi03 / TodayExtension-ScoreWidget TodayExtension-ScoreWidget –可重用的代码片段,用于使用Today Extension扩展iOS应用。 github.com 在项目中导入分数小部件文件 为您的Xcode项目添加一个新目标(即今天的扩展),并导入Score Widget文件。 只需解压缩ScoreWidget.zip,然后将解压缩的文件夹放在目标层次结构下。 注意:添加文件时,请确保选择“如果需要,请复制”,然后选择扩展名作为目标。 添加分数小部件视图 将Today Extension目标添加到项目后,XCode会自动生成TodayViewController.swift和MainInterface.storyboard。 转到MainInterface.storyboard并从TodayViewControllerScene中删除Label。 我们不需要XLabel,因为我们拥有用于得分小部件视图的XIB。 接下来,我们需要将XIB作为子视图添加到TodayViewControllerScene。 为此,将以下内容添加为TodayViewController类的第一行。 var scoreWidgetView:ScoreWidgetView? 实例化声明的变量,并使用以下代码添加为子视图。 scoreWidgetView = ScoreWidgetView()。loadNib()为? ScoreWidgetView scoreWidgetView?.frame = self.view.frame self.view.addSubview(scoreWidgetView!) 这就是您的viewDidLoad()的外观。 我们完成了实例化自定义视图并将其添加为子视图的操作。 现在,让我们在“显示更多/显示更少”按钮上处理视图的放大和缩小。 处理视图的扩大和缩小 要添加“显示更多/显示更少”按钮,请在viewDidLoad中添加以下几行。 如果#available(iOSApplicationExtension 10.0,*) { extensionContext?.widgetLargestAvailableDisplayMode = .expanded }其他 { //早期版本的后备 } “ widgetLargestAvailableDisplayMode”的值决定是否可以扩展窗口小部件。 现在,您的viewDidLoad()应该看起来像 添加以上行将在我们的小部件上启用“显示更多”按钮。 接下来,当用户点击“显示更多”按钮时,我们需要处理扩展和收缩。 […]

今日扩展(小部件)

? Uma Today Extension,您的小部件,可扩展到其他信息,或用于复制。 快速搜索列出iPhone 6S的零件,使用3D触摸或复制的功能。 可以使用ViewView常规组件的Widget小部件。 Porémele possuilimitaçõesgrandes de processamento,enãoallowe entrada de texto com teclado。 Alémdisso,一个ScrollViews nos小部件的文档建议。 范例 以acordo com为准则,以简单易用的小部件交互方式,作为首选执行命令的通用工具。 一个值得信赖的应用程序示例。 谷歌地图 可以使用Google Maps widget或wi pos usa maipróximoalocêteàlocalizao ponto deônibusmaisfrequência,或按实际速度进行操作。 速度 暂时保留所有小部件的权利,请以最及时的方式恢复。 努班克 您可以在Nuban te mostra de maneira be s简单部件中工作,也可以在balançoda sua conta中获取信息。 科莫criar um小部件? 1º—没有Xcode的Criar um projeto Abra Xcode e Crie um Novo Projeto […]

带有Swift属性,扩展名,枚举和泛型的备忘单。

在Swift中覆盖存储的属性: 快速存储的属性和计算的属性有两种属性 储存财产 存储的属性是与结构或类的实例相关联的变量。 Swift现在通过使用let和var分别表示常量和可变属性,使属性声明更加简洁 计算财产 除了存储的属性外,类,结构和枚举还可以定义计算的属性 ,而实际上并不存储值。 相反,它们提供了一个getter和一个可选的setter,以间接检索和设置其他属性和值。 现在的概念是我们不能覆盖存储的属性 它将引发错误,因为如果我们真的想覆盖存储的属性,则无法覆盖它,那么我们需要使其成为计算属性。 结论:如果要覆盖子类中的存储属性,则需要将其定义为计算属性。 进行一些扩展,有助于获得UIStoryboard对象以用于Application中存在的多个情节提要 通常,我们在一个项目中的不同模块中会使用多个情节提要,所以通常我们通过其名称来获取情节提要。 并且我们在此情节提要中实例化了适当的UIViewController,并针对项目中不同的不同情节提要反复进行此操作。 因此,更好的方法是创建UIStoryboard的扩展,并定义所有不同的Storyboard,然后在无需编写太多代码的情况下将其使用在任何您想使用的地方。 用法:就像我们要创建故事板主对象一样,我们只需编写以下行 它可以节省我们的时间,还可以避免错误输入(错误的故事板名称等) 创建用于实例化UIViewController的通用方法 通常,当我们从一个屏幕导航到另一个屏幕时,我们实例化一个UIViewController并将其推入导航控制器。 在这种情况下,我们需要编写类似的重复代码,而只需稍加修改即可。 因此,我将创建UIViewController的扩展,以减少我们的开发时间并保持我们的代码质量。 它还将减少重复的代码。 UIStoryboard和UIViewController扩展的组合用法 如果我们要实例化Main Storyboard中定义的UIViewController。 使用Main.storyboard中存在的标识符实例化UIViewController 2 。 如果要实例化xyz故事板中定义的UIViewController。 它将实例化OtherStoryBoard.storybard中定义的UIViewController。 重要说明 :-这里使用扩展UIViewController是其强制使用扩展UIStoryboard。 结论:正如我们看到的那样,扩展的巧妙使用将减少我们的工作量并保持代码质量。 我想提一个名字,没有他,这个博客是不可能的。特别感谢阿曼提供的宝贵意见。 面临的问题将邮件发送到Ved.bhumca11@gmail.com。

聪明地使用Swift扩展

对Swift来说是新手的开发人员,对于他们来说,扩展可能是一个新名词,所以我想与Swift扩展及其使用分享我的经验。 什么是扩展名? 扩展为现有的类,结构,枚举或协议类型添加了新功能。 -Apple Swift开发人员参考 快速扩展使您可以将行为添加到任何Type以及现有Type中 。 让我告诉你它是如何工作的。 快速扩展还有其他用途,可以提高代码的可读性。 它还可以帮助您使代码井井有条。 协议一致性 当我们需要确认一个或多个协议时,可以将其实现为该类的扩展。 这就是我们可以确认协议的方式。 我们可以将协议的所有功能放到扩展模块中。 会的。 我通常使用pragma标记来执行此操作,因为这样做是为了提高代码的可读性。 实用标记在跳转栏中添加视觉标记,有助于在文件内快速导航。 我们可以使用UITableViewDelegate , UITableDataSource , UIWebDelegates等预定义协议进行此操作 。我们可以分隔每个协议 带有单独的实用标记的确认,以便我们可以轻松地在文件中导航。 代码分离 这是将整个代码分成多个命名串的另一种方法。 我们仅收集具有共同或联合任务的行为组。 见图。 保留初始化程序 当我在需要在我的一个项目中保留结构的初始化程序时学会了这一技巧。 当我做到这一点时,我就像哇……扩展使我的生活变得很认真,很高兴与大家分享这一点。 让我举一个例子,这对您来说更有意义。 在上面的示例中,有一个名为Address的结构,其属性为houseNumber,city和state。 Swift提供了一个免费的初始化器,可用于实例化Address结构的对象。 对于Struct,我们有一个免费的初始化程序,用于初始化其所有属性(请参见上图中的蓝色部分) 如果我们需要自定义初始化程序怎么办? 在某些情况下可能需要自定义初始化程序。 因此,我们通常要做的是看一下。 我们添加了自定义初始化程序,就像我在上图中添加的一样。 现在我要讲的重点是不要失去您的注意力。 当我们添加这样的自定义初始化程序时,我们只是丢失了默认的初始化程序。 现在,我们只有定制的初始化程序来实例化Address结构的实例。 那么我们如何克服这个缺点呢? 是的,您是对的,Swift扩展可以解决此缺点。 当我们添加自定义初始化程序作为扩展时,会发生什么? 让我们看看 瞧,现在我们有了两个初始化器。 华友世纪🙂 摘要 Swift扩展使您可以向任何类,结构或枚举添加行为,即使您无权访问原始源代码(就像我们对UIColor所做的那样)。 还使我们能够以井井有条的方式来编写智能代码,使代码更整洁,更易读。 现在轮到您了,去玩扩展程序。 所以,伙计们,我已经分享了我在Swift扩展方面的经验,我仍在学习和探索更多的智能编码方法。 让我知道您的想法,欢迎提出建议。

鸡问题(面向协议的编程)

大家好 在本文上,我们来讨论协议扩展和面向协议的编程(POP)。 关于这个主题有很多讨论,Swift协议扩展和多重继承之间有很多比较。 因此,让我们讨论两者之间的区别以及POP听起来为什么更可靠的原因。 鸡问题 我喜欢用这个例子来说明一个小问题如何变成大规模开发和实际应用。 首先让我们看一下问题,然后再讨论。 想象一下我们需要构造鸟类的“对象/实体”的应用程序。 乍一看,我们将拥有Perrots,Sparrows和Falcons。 现在,让我们为此创建一个漂亮而智能的代码。 OOP和多重继承 所有这些鸟类共享许多东西,例如“喙”,“羽毛”,并且它们都可以“飞行”。 因此,让我们考虑以下Birds App的体系结构。 看起来很棒! 在这一点上,我们作为开发人员对我们的创作感到非常自豪。 它干净,可靠,我们只编写了一次代码,只是“ fly”方法的一种实现,这是一种非常复杂的算法。 现在,我们制作了该产品的版本1 。 此时,客户(Bird应用程序的所有者)说:“嘿,您知道吗,我注意到我的客户也希望拥有Chicken,所以请向此应用程序中添加Chickens,一旦您将它变得非常简单告诉我您有一个非常灵活的体系结构与OOP一起使用” 好的,这很容易……鸡是鸟,所以它将成为鸟的一个子类……但是等等……鸡不能飞! 因此,在这一点上,我是否需要重写此“ fly()”方法,并从“ Bird”中取消我所有漂亮的算法? 等等,这样做不仅是在重写代码,但是如果我心爱的客户决定明天他将发明一种新型的能飞的超级鸡肉,我该怎么办? 将“鸡”否定为“ fly()”的新“鸡”子类? 如果我的客户决定将应用程序移至南极并创建企鹅? 企鹅没有羽毛! OMG…我刚刚意识到我的整个体系结构对我的客户来说不够灵活! 我应该改变它吗? 我应该重写我的整个应用程序吗? 提出V2? 我应该更换我的客户吗? 我是否应该换一个鸟类完美的星球,它们都具有相同的特征? 好吧好吧让我们冷静一下 让我们尝试考虑可能的解决方案,毕竟,OOP很棒,并且确实可以反映现实世界的复杂性。 好吧,不完全是。 我们可以尝试使用OOP解决方案来奋斗。 我不会深入探讨我们可以尝试的失败解决方案: 创建两个基类:“鸟”和“飞鸟”(失败:如果客户决定购买飞机怎么办?) 使用协议/接口定义飞行方法(失败:重写很多代码) 将“ fly()”定义为接收可以飞行的对象的静态方法(失败:如果我有数百万个飞行对象怎么办?并发,多线程) 我与数百名不同的开发人员进行了此练习,让他们尝试许多解决方案。 简而言之,在OOP中解决此问题的唯一可能解决方案是使用多重继承,但是众所周知,这很危险。 只有很少的编程语言允许这种功能,并且在其自身的实现中有许多警告。 Pearl和Python使用一个有序列表进行多重继承,Java 8尝试使用编译器来避免错误,C ++实际上是真正在其完整扩展中真正实现多重继承的唯一语言之一。 因此,如果您不想仅在应用程序中创建C ++模块来解决该问题,就让我们现在尝试使用Swift功能来解决Chicken Chicken问题。 Swift […]

ReactiveKit的扩展集合

傻瓜发信号 扩展布尔 { func trueSignal(或失败:NSError)-> Signal { 保护自己else {返回Signal.failed(fail)} 返回Signal.just(true) } } 将布尔转换为故障 信号 。 2.可选信号 扩展名可选 { func valueSignal(或失败:NSError)-> Signal { 切换自我{ case .some(let value):返回Signal.just(值) 案例.none:返回Signal.failed(失败) } } 将Optional转换为故障 信号 。 3.尝试/捕获信号 func TrySignal (有趣:@escaping()throws-> T)-> Signal { 返回信号{ 做{ 让res =尝试fun() Observer.completed(with:res) }将let错误捕获为NSError { 观察者失败(错误) } 返回NonDisposable.instance } } 将try / catch转换为信号 4.不 […]

其他一些ReactiveKit扩展

在上一篇文章(ReactiveKit的扩展集合)之后,还有更多… 对信号的承诺 导入ReactiveKit 导入PromiseKit 扩展承诺 { 公共函数toSignal()-> Signal { 返回Signal { self.then {elem-> Void in Observer.completed(with:elem) } .catch {错误 rator.failed(错误为NSError) } 返回NonDisposable.instance } } } 在我正在从事的项目中,有一段时间,我们同时使用PromiseKit和ReactiveKit,此扩展对于将PromiseKit Promise转换为ReactiveKit信号非常有用,从而提供了帮助迁移的桥梁。 2.顺序信号 func serialSignals (_信号:[Signal ], 已完成:[ReactiveKit.Result ] = []) -> SafeSignal <[ReactiveKit.Result ]> { 守卫信号=信号。第一 否则{返回Signal.just(已完成)} 让newSignals = signal.count> 0吗? Array(signals [1 …]):[] 返回信号 .map {ReactiveKit.Result.success($ 0)} .flatMapError […]

使用Swift的Awesome Extension的更聪明的print()方法

尊敬的所有iOS开发者和读者, 我的这篇文章将尝试向您介绍Swift语言在扩展方面的功能。 对于新手, 扩展为现有的类,结构,枚举或协议类型添加了新功能。 苹果 尽管在Objective-C中也可以使用扩展/类别。 但是Swift在这方面已经赋予了更多权力。 因为在Swift中,我们也可以创建原始数据类型的扩展,例如Int,Float Double。 所以我在说什么很棒的扩展。 我们一直在使用NSLog或Print来打印变量的值以进行调试。 print(“Trying to print \(someVar)”) 另外,我们可以从Xcode控制台使用po命令来查看变量的值。 我们也可以将p和fr v用于相同的目的,请阅读更多。 丑事: 我发现丑陋的是在变量前写了NSLog(“或print( ,在变量后写了”) 。这有点使我的Raftaar在编写代码时遇到了麻烦 。 因此,如果我们只将po()放在变量后,那会不会更聪明 。 喜欢 someVar.po() ,它将打印在控制台上, 代替 NSLog(“%@”,someVar) or print(“Trying to print \(somevar)”) 那就是我们今天要做的。 好吧,这里的主要目标是能够在任何类型的变量上调用po() 。 当我尝试创建扩展时,我正在考虑使用AnyObject创建on。 但是幸运的是我们无法在AnyObject上创建扩展。 经过一番研究后,我意识到所有非原始类型iOS框架的基类都是NSObject 。 所以这是价值十亿美元的扩展extension 扩展NSObject { func po() { 打印(个体经营) } } 现在,只需在String , Array , […]

开始进行Swift编程第9部分-基本协议,扩展和下标

在上一篇文章中,我们介绍了类型转换,安全展开可选内容和访问控件。 Swift编程第8部分开始-类型转换,安全解压缩可选项和访问控制 在上一篇文章中,我们讨论了初始化,反初始化,覆盖和引用计数。 medium.com 没什么困难,对于您中的某些人而言,也许最好不过是适度的,因为有了访问控制的概念。 这篇文章可能会使事情再次升温,但这又仅仅是因为实际的应用程序用例。 我将尽力以一种可以帮助您理解所有内容以及何时应在何处使用所涉及的主题的方式来解释事情。 我知道有些教程可以直接跳转并提供扩展,但是我不会。 扩展是利用您已经知道的内容做更多事情的基础,因此,我决定最好从协议开始。 因此,让我们深入。 好的,所以协议和扩展声音令人生畏,Apple提供的定义在您开始时并不能消除浑水。 这个定义直接来自苹果的书: 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 你们中有些人可能已经了解到,其他人可能仍然会挠头。 不用担心,现在,让我们暂时忘记该定义,我有一个使用棒球的指导来指导我们进行定义。 在棒球中,我们有不同的位置,例如击球手,投手,接球手,垒手,外野手,教练和裁判员。 如果您对棒球有任何了解,您就会知道团队中的每个人都有自己的角色,每个人都擅长于该角色。 我们不能只是让三垒手成为投手,或者让裁判成为外野手。 第一种情况很难,因为团队喜欢为一垒手雇用左撇子,为三垒手雇用右撇子。 另一个似乎不是一个好主意,因为两队之间的裁判是中立的。 如果每个玩家都是一堂课, 那么他们如何玩游戏就由协议定义。 让我们看看它在代码中的外观。 扩展以简单的概念而得名。 扩展实质上是将功能扩展到类,结构或协议。 关于它们的使用方式,我将引用Swift中的Foundation库。 Foundation有一个名为UITableView的类。 UITableView本身仅处理显示表视图。 但是,我们可以通过给它一个名为UITableViewDataSource的扩展来扩展其功能。 这为采用此协议的类提供了提供数据如何在表视图内部显示的上下文的能力。 上图是扩展的一个很好的例子。 通过单击“无选择”,您可以打开当前布局的树。 这使您可以通过单击树的任何部分来浏览代码,Xcode将专注于该代码。 通过使用//MARK: — Properties ,可以在属性上方创建一条水平线,同样可以使用 //MARK: Properties —在属性下方放置一条水平线。 或者,您可以在上方和下方都设置一个,但是我通常只在上方放置一个,以将其分成这样的部分。 您可以选择最有意义的选项。 有关更多信息,请查看Apple的标记文档。 好的,只是我想离开这里的提示,回到扩展。 除了将您的代码分成逻辑区域外,它们还做了其他一些事情,这也成为我成为协议狂热者的原因,并尽可能尝试使用它们。 因此,协议对于团队来说很棒,从一开始就显而易见,但是您可能会问自己,如果您是一个单独的开发人员,为什么还要使用协议? 您知道一切都会做什么,并且不介意在一年后回到您的代码以发布更新时重新学习。 特别是如果这意味着必须编写更多的代码,这对于您的应用正常运行并不重要。 还记得Fielder协议吗? 如果我告诉您不必编写协议要求,也不必单击红色的停止符号以使它在每次使用协议的情况下都实现每个方法存根,该怎么办。 那您想要协议吗? 纯粹的事实是,在上面的示例中,如果您在同一实现中使用darn编写7次6个属性和4个方法,那将是疯狂的,那就是42个属性和28个方法,更不用说每种方法所涉及的逻辑了。 对我来说听起来像是折磨。 […]

符合条件概览

Swift 4.1已有几天推出,并且具有一个有趣的功能: 条件一致性 。 这是用于实现面向协议的编程以及API设计的新工具。 这篇文章是对这种崭新技术的快速介绍,并且肯定会在接下来的几周内进行深入探讨。 和往常一样,您可以在我的个人博客上找到原始帖子。 借助Swift,您可能会对实现扩展的所有不同方式感到困惑。 随着语言的成熟,出现了新的扩展可能性,开发人员必须选择合适的语言。 基本上,扩展允许扩展类型的行为而不必将其子类化: 进行实用程序功能或实现有效的工厂模式很有用。 对专用于泛型类型的基本扩展进行了改进: 例如,将sum()函数应用于Bool数组可能没有意义。 这种扩展允许开发人员将新功能引入现有类型,但使它们可以安全地同时使用。 当您设计供其他开发人员使用的API时,这非常有用。 一旦满足良好要求,他们就可以一次“免费”地受益于某些代码。 扩展不仅可以将行为添加到现有类型,还可以修改类型本身以使其符合协议。 这在存在异质性的地方带来了一致性。 如果不使String , Ints和Optionals符合相同的协议,就不可能将它们混合在一起。 但是,尽管Array的每个元素都是“ Resettable ”,但我们仍然必须对其进行解析(使用map )并在每个元素上调用“ reset() ”以实现全局操作。 有条件的一致性将大大帮助希望重置整个Array的开发人员无缝地执行此操作。 到目前为止,我们还没有谈到面向协议的编程。 该范例具有向协议添加默认行为的能力。 符合此协议的类型也将有益于此默认行为(或覆盖它)。 这是一种特殊的扩展名,并不是本文的重点。 因此,在这里我们不要引入过多的噪音,而只关注扩展具体类型的能力。 条件一致性是Swift 4.1随附的全新功能。 它是条件扩展和一致性扩展之间的混合。 如此,它继承了它们的两个关键原则: 带来了新功能,但使它们可以安全同时使用 在存在异质性的地方带来一致性 实际上,其背后的主要思想之一是:如果可以将行为应用于超集的每个元素,那么我们可以考虑将该行为也应用于超集本身: 由于Array的每个元素都是Resettable ,因此整个Array也是。 例如,这正是苹果公司对Equatable和Hashable所做的事情。 使用Swift 4.1时,等于数组的元素数组是等于数组的。 在我们的示例中,最大的功能是,我们可以在根Array中嵌入一个Resettables数组,并且仅使用一条语句“ resettableArray.reset() ”,即可重置整个数据结构。 这是处理递归的一种非常优雅的方法。 如我们所见,就API设计而言,与基本的“ 一致性扩展 ”相比,使用“ 条件一致性 ”具有很大的优势。 API设计人员将在他的框架中内部化他认为很聪明的代码(此处为reset()函数),以免费提供给符合相应要求的开发人员。 […]