菜鸟教程小白 发表于 2022-12-13 04:50:33

ios - 在子类中添加到父类(super class)的结构


                                            <p><p>我正在使用 Mogenerator 为我的 CoreData 构建类,我喜欢它基于 <code>_TAGUser</code> 的头文件中的 CoreData 属性生成的属性名称:</p>

<pre><code>extern const struct TAGUserAttributes {
    __unsafe_unretained NSString *displayName;
    __unsafe_unretained NSString *email;
} TAGUserAttributes;

@interface _TAGUser : NSManagedObject

@property (nonatomic, strong) NSString* displayName;
@property (nonatomic, strong) NSString* email;

@end
</code></pre>

<p>而这个在实现文件中:</p>

<pre><code>const struct TAGUserAttributes TAGUserAttributes = {
    .displayName = @&#34;displayName&#34;,
    .email = @&#34;email&#34;,
};

@implementation _TAGUser

@end
</code></pre>

<p>现在在子类<code>TAGUser</code>中,我在头文件中添加了这个属性:</p>

<pre><code>@interface TAGUser : _TAGUser {}

@property (strong, nonatomic, readonly) NSString *firstLetterOfDisplayName;

@end
</code></pre>

<p>这是实现文件:</p>

<pre><code>@implementation TAGUser

- (NSString *)firstLetterOfDisplayName {
    return ((self.displayName != nil &amp;&amp; self.displayName.length &gt; 0) ?
      .uppercaseString :
      nil);
}

@end
</code></pre>

<p>有没有一种方法可以扩展或添加到结构 <code>TAGUserAttributes</code> 以便我可以在代码中的任何其他位置调用 <code>TAGUserAttributes.firstLetterOfDisplayName</code> 以进行 KVO,部分映射在 <code>NSFetchedResultsController</code> 等?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>不只是扩展一个 C 结构。您有两种可能的方法:</p>

<ul>
<li><p>将 <code>NSStringFromSelector(firstLetterOfDisplayName)</code> 用于 KVO 等。这样您可以获得一些编译器安全性。如果具有给定名称的选择器不存在,编译器会报错。但是,选择器可以存在于可见范围内的任何位置,不仅在您的 <code>TagUser</code> 类中,以使编译器满意。</p></li>
<li><p>我在这里和那里看到的另一种方法是添加另一个结构,其中包含指向原始结构的指针。我现在想不出更好的命名方式,但我希望它可以理解:</p></li>
</ul>

<p>在 .h 文件中:</p>

<pre><code>extern const struct TAGUserAdditionalAttributes {
    const struct TAGUserAttributes* base;
    __unsafe_unretained NSString * firstLetterOfDisplayName;
} TAGUserAdditionalAttributes;
</code></pre>

<p>在 .m 文件中:</p>

<pre><code>const struct TAGUserAdditionalAttributes TAGUserAdditionalAttributes = {
    .base = &amp;TAGUserAttributes,
    .firstLetterOfDisplayName = @&#34;firstLetterOfDisplayName&#34;
};

   //then you can use &#34;base&#34; attributes like this:
   TAGUserAdditionalAttributes.base-&gt;displayName
</code></pre>

<p>不幸的是,指针语法让它很丑,但它仍然有效。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在子类中添加到父类(super class)的结构,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27929068/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27929068/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在子类中添加到父类(super class)的结构