gpt4 book ai didi

cocoa - 发电机提供哪些功能?

转载 作者:行者123 更新时间:2023-12-03 16:02:09 27 4
gpt4 key购买 nike

我已经使用Mogenerator一段时间了,尽管在命令行选项上有一个合理的Getting Started GuideStack Exchange article,但是我还没有找到有关它提供的所有功能的良好指南。
简而言之:除了Core Data为您提供的类之外,mogenerator实际生成什么?

(坦率地说,我一直在其中没有意识到的标头/实现中发现一些惊喜,因此,我决定逐步研究生成器模板并编写代码,并记录我在Stack Exchange问​​题与解答中发现的内容。我很乐意查看其他答案和修改。)

最佳答案

除了其两类系统的核心功能之外,mogenerator还可以通过自动在机器头文件和实现文件中实现许多有关Core Data的最佳实践来帮助您。

物业存取器

访问您的实体属性的方法是生成器生成内容的核心。但是,除了现成的Xcode类生成器提供给您的之外,访问器中还实现了一些不错的功能。

标量访问器

Xcode的内置生成器使您可以选择“对原始数据类型使用标量属性”。此选项使您可以选择Xcode创建属性时,使用NSTimeInterval代替日期类型的NSDate,使用BOOL代替布尔类型的NSNumber,并且使用int16_t(或类似值)而不是< cc> s。

我发现这很令人生气,因为大多数时候我更喜欢原始类型,但不适用于NSNumber,而NSDateNSTimeInterval有用得多。因此,Core Data让我可以选择对象,在这种情况下,我将不断取消装箱内容,并犯诸如if(myBooleanAttribute)之类的愚蠢错误(之所以总是YES,因为myBooleanAttributeNSNumber,而不是BOOL )。或者我可以有标量,但是在那种情况下,我得到的NSTimeInterval必须始终转换为NSDate。或者,我可以手动编辑所有生成的文件,以提供所需的NSDateBOOL组合。

另一方面,mogenerator为您提供了两种选择。例如,您将同时获得为您提供myBooleanAttributeNSNumber吸气剂(以便于存储在NSArray中)和为您提供实际myBooleanAttributeValueBOOL吸气剂。与整数和浮点数相同。 (生成器不会生成NSTimeInterval访问器:仅NSDate s。)

类型化的可转换属性

如果您具有可转换的属性,则可以在属性中设置特定的UserInfo键(attributeValueClassName),该键将指定属性将返回/接受的类。 (它会正确地向前声明该类,等等。)我发现本文记录的唯一位置是在Verious上。

相反,Xcode代码生成器只会将这些可转换属性键入为id类型。

验证声明

尽管Mogenerator不会自动生成任何验证方法,但它确实在机器h文件中包括适当的签名作为注释。签名似乎主要是出于历史原因,但这确实意味着,如果您决定在人工文件实现中实现签名,则很容易复制和粘贴签名。 (由于您不应该直接调用验证,因此我实际上不会取消对声明的注释。)

原始访问器

Core Data已经为您提供了这些访问原始值的方法,但是由于某些原因,它们并未在Xcode生成的标头中包含它们。将生成器包含在其头文件中可以使访问原始值变得更加容易。

获取的属性

Mogenerator将为获取的属性生成访问器。据我所知,没有办法让Xcode生成器执行此操作。

辅助方法

NSFetchedResultsController自动生成

如果您的实体中有多对多关系,并且您将--template-var frc = true传递给mogenerator,mogenerator将自动生成一种方法来为与父对象关联的子对象创建获取请求。它甚至自动生成唯一的缓存名称,并隔离#if TARGET_OS_IPHONE预处理器宏中的所有内容。

即使这不能满足您的特定需求,它也是如何扩展模板的一个很好的例子。

+ fetchMyFetchRequest:moc_

如果您喜欢在模型中定义获取请求,那么与硬编码字符串相比,这是一种更好的检索请求的方法。

-MyEntitySet

Mogenerator使用KVC的魔力为您提供了一个建立关系的NSMutableSet代理。

+ entityName

是否需要为NSFetchRequest或其他Core Data方法提供实体名称?通过使用这种简单的方法将实体名称作为NSString返回,可以避免使用硬编码字符串。

+ insertInManagedObjectContext:和EntityInManagedObjectContext:

避免对实体名称进行硬编码的另一种方法是使用这些辅助方法。

输入的对象ID

您的每个标头和实现还包括一个MyEntityID类。它们是空的接口和实现,仅是NSManagedObjectID类的子类。此外,每个模型类都有一个名为objectID的帮助程序方法,该方法将覆盖NSManagedObject中的标准objectID方法。 helper方法除了将超类的返回值强制转换为MyEntityID类型外,什么也不做。

最终结果:如果您不小心交换了来自不同实体的对象ID,则编译器可能会遇到错误。



子类化自定义超类

命令行选项之一是--base-class:,它允许您指定所有生成的类都将继承的基类。这非常有用,要么使您可以在其中定义方便方法的基类(在给定Core Data的情况下,您可能应该这样做),要么可以使用现有的Core Data工具包(如SSDataKit)(或两者)。

包含

这很简单,但是如果指定--includem参数,mogenerator将生成一个包含所有模型头文件的头文件。如果要在PCH中包含所有标头,或者要包含其他一些标准标头,则很方便。

所有属性,关系,获取的属性的常量定义

标头中包含结构的外部声明,该标头为实体中定义的每个属性和关系定义了NSString。这使您可以定义谓词和其他参数,而无需将实体名称烘焙到字符串中。例如,

req.predicate = [NSPredicate predicateWithFormat:
@"(%K == YES) AND (%K <= %@)",MyObject.favorite, MyObject.availableDate, [NSDate date]];


(用于“命名空间”常量的这种类型的结构在 his blog上描述了My Mike Ash。

const用户信息键/值的定义

类似地,在头中定义了一个结构的外部声明,该声明包括作为结构成员的键和作为值的值。即

NSLog(@"User info for key my key is %@",MyObjectInfo.mykey) //will log "myvalue" 


备用模板

关于Mogenerator的有趣的事情之一是,在构建Mogenerator时,其作者(Wolf Rentzsch)基本上为Xcode生成的xcdatamodel文件构建了一个通用的解析器和模板引擎。因此,您无需使用发电机模板。您可以为自己提供一个简单的命令行参数。 GitHub站点上有很多 user contributed templates

实际上,您甚至不必使用Core Data。许多提供的模板使您可以基于数据模型生成一系列普通的NSObject模型类。 (所谓的PONSO:“普通的旧nsobjects”)。是否想在Xcode中使用数据建模器,但要使用其他持久性机制?发电机可以为您提供帮助。

您甚至根本不需要生成对象: another interesting submitted template仅提供两种不同模型版本的差异。

关于cocoa - 发电机提供哪些功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22566121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com