我一直在尝试找到一种解决方法来在Objective-C中声明@protected属性,因此只有层次结构中的子类才能访问它们(只读,而不是写入).我读到没有记录的方法这样做,所以我想到了这个解决方法,我想问一下StackOverflow对它的看法.
层次结构顶部的每个自定义类都包含三个类,一个实现和两个接口.我们给它们命名:
ClassA.h
ClassA_protected.h
ClassA.m
Run Code Online (Sandbox Code Playgroud)
那么这个ClassA的任何子类都会像往常一样:
ClassB.h
ClassB.m
Run Code Online (Sandbox Code Playgroud)
首先,我创建了接口ClassA.h,其中我声明了一个受保护的int变量,因此ClassA的任何子类都可以访问它:
@interface ClassA : NSObject{
@protected
int _myProtectedInt;
}
@end
Run Code Online (Sandbox Code Playgroud)
下一步是我正在谈论的解决方法.但是,一旦你阅读它,你会发现它非常直接.我声明了第二个名为ClassA_protected.h的接口,它实际上是ClassA.h 的扩展,允许我们将属性标记为readonly
:
#import "ClassA.h"
@interface ClassA ()
@property (nonatomic , readonly) int myProtectedInt;
@end
Run Code Online (Sandbox Code Playgroud)
准备受保护层次结构的最后一步是在ClassA.m中声明它的实现,我们只合成我们的属性:
#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end
Run Code Online (Sandbox Code Playgroud)
这样,每个需要成为ClassA.h子类的类都将导入ClassA_protected.h.因此,像ClassB.h这样的孩子如下:
#import "ClassA_protected.h"
@interface ClassB : ClassA
@end
Run Code Online (Sandbox Code Playgroud)
以及从ClassB.m的实现中访问此属性的示例:
@implementation ClassB
-(void) method {
//edit protected variable
_myProtectedInt= 1; …
Run Code Online (Sandbox Code Playgroud) 在采用现代Objective-C指南时,Apple建议使用NS_ENUM宏而不是枚举.我还阅读了NSHipster关于NS_ENUM和NS_OPTIONS 的解释.
也许我错过了一些东西,但我不太明白以下两个片段之间有什么区别,如果有什么NS_ENUM
建议的方法可去(除了可能为了与旧编译器向后兼容)
// typedef enum
typedef enum {
SizeWidth,
SizeHeight
}Size;
// typedef NS_ENUM
typedef NS_ENUM(NSInteger, Size) {
SizeWidth,
SizeHeight
};
Run Code Online (Sandbox Code Playgroud) 我正在使用Java和SimpleXML
我需要用SimpleXML解析这个XML文件:
<magazine title="N?mero 1" id="1">
<description>yutyutyu</description>
<miniature>http://web.com/scripts/getImage.php?idMagazine=1&resource=miniature.jpg</miniature>
<summary>2</summary>
<pages>
<page src="http://web.com/scripts/getImage.php?idMagazine=1&resource=page_001.jpg" id="1" thumbnail="http://web.com/scripts/getImage.php?idMagazine=1&resource=thumbnail_001.jpg">
<areas>
<area id="1">
<top>188</top>
<left>204</left>
<width>399</width>
<height>319</height>
<action type="openBrowser">http://www.web.com</action>
</area>
<area id="2">
<top>188</top>
<left>204</left>
<width>399</width>
<height>319</height>
<action type="openBrowser">http://www.web.com</action>
</area>
</areas>
</page>
<page src="http://web.com/scripts/getImage.php?idMagazine=1&resource=page_002.jpg" id="2" thumbnail="web.com/scripts/getImage.php?idMagazine=1&resource=thumbnail_002.jpg"/>
<page src="http://web.com/scripts/getImage.php?idMagazine=1&resource=page_003.jpg" id="3" thumbnail="web.com/scripts/getImage.php?idMagazine=1&resource=thumbnail_003.jpg"/>
</pages>
</magazine>
Run Code Online (Sandbox Code Playgroud)
我得到了这个例外:
03-22 16:02:35.072:WARN/System.err(1931):org.simpleframework.xml.core.ValueRequiredException:无法满足@ org.simpleframework.xml.ElementList(data = false,empty = true,entry = ,inline = false,name =,required = true,type = void)on field'area'public java.util.ArrayList com.Magazine.Page.areas for class com.Magazine.Page at line 1
杂志有一系列页面,每个页面都有一系列区域,每个区域都有一个动作类,其中包含更多内容.问题必须在区域数组上,因此它位于Page类中.
@Root (name="magazine")
public class FullMagazine {
@Attribute
String …
Run Code Online (Sandbox Code Playgroud) 这是我第一次比较Objective-C中的日期.我一直在网上搜索一段时间,我发现的所有例子都涉及从字符串构建一个NSDate,所以我决定在这里问一个新问题......我的问题如下:
我需要知道两个NSD是否在同一天,忽略了时间.我有两个NSArray
包含一组日期,我需要逐个确定第一个NSArray
中的哪一个与第二个数组在同一天.
- (void)setActiveDaysColor:(UIColor *)activeDaysColor
{
for (DayView *actualDay in _days)
{
NSDate *actualDayDate = [actualDay date];
for (NSDate *activeDayDate in self.dates)
{
// Comparison code
// If both dates are the same, tint actualDay with a different color
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢你,祝你有个愉快的一天.
亚历克斯.
objective-c ×3
date ×1
enums ×1
ios ×1
java ×1
nsdate ×1
properties ×1
protected ×1
xml ×1
xml-parsing ×1