我有一个名为Record的coredata实体,并且有一个属性dateUpdated.我注意到生成的NSManagedObject子类没有可选标记(?)
CoreData编辑器:

生成的子类:

预期:

更新: 这是乏味的在我的部分,因为我想再生子类每一次,这意味着我还需要手动更新所有可选值.在子类中使用非可选(不带'?')会导致我在分配之前检查evalue,如下例所示:
// sample value:
// serverDateFormatter = "yyyy/MM/dd"
// dateString = ""
// Branch is a subclass of Record (see above images)
var date = self.coreData.serverDateFormatter.dateFromString(dateString)
if date != nil
{
branch.dateUpdated = date
}
Run Code Online (Sandbox Code Playgroud)
但是如果xcode可以在子类中使用(?)自动设置可选值,我只需要这样做:
branch.dateUpdated = self.coreData.serverUTCDateFormatter.dateFromString(dateString)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我有一堆属性需要手动标记为可选.
我正在构建一个子类dict和覆盖的类__setitem__.我想确定我的方法将在可能设置字典项的所有实例中被调用.
我发现了三种情况,Python(在这种情况下,2.6.4)__setitem__在设置值时不会调用我的重写方法,而是PyDict_SetItem直接调用
setdefault方法中update方法中作为一个非常简单的测试:
class MyDict(dict):
def __setitem__(self, key, value):
print "Here"
super(MyDict, self).__setitem__(key, str(value).upper())
>>> a = MyDict(abc=123)
>>> a['def'] = 234
Here
>>> a.update({'ghi': 345})
>>> a.setdefault('jkl', 456)
456
>>> print a
{'jkl': 456, 'abc': 123, 'ghi': 345, 'def': '234'}
Run Code Online (Sandbox Code Playgroud)
您可以看到仅在显式设置项时才调用重写的方法.为了让Python始终调用我的__setitem__方法,我不得不重新实现这三种方法,如下所示:
class MyUpdateDict(dict):
def __init__(self, *args, **kwargs):
self.update(*args, **kwargs)
def __setitem__(self, key, value):
print "Here"
super(MyUpdateDict, self).__setitem__(key, value)
def update(self, *args, **kwargs): …Run Code Online (Sandbox Code Playgroud) 什么之间的区别UserDict,dict并ABC和建议哪一种?文档似乎已经弃用了UserDict?
似乎UserDict update()会使用我的setitem方法,而dict不是?在我想要自定义setitem和getitem功能的情况下,哪些方法是非常重要的?
使用ABCs我必须实现绝对所有方法,因为它没有提供默认实现?
我想做一dict件事做两件事:
intern() 所有键和值所以其中UserDict,dict并ABC能最好地让我做到这一点?
我有以下类,使用init方法:
class user {
var name:String
var address:String
init(nm: String, ad: String) {
name = nm
address = ad
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试子类化这个类,但我不断收到错误super.init():
class registeredUser : user {
var numberPriorVisits: Int
// This is where things start to go wrong - as soon as I type 'init' it
// wants to autocomplete it for me with all of the superclass' arguments,
// and I'm not sure if those should go in there or not:
init(nm: String, ad: String) { …Run Code Online (Sandbox Code Playgroud) 我终于升级了我的python版本,我发现了添加的新功能.除此之外,我正在摸索新__init_subclass__方法.来自文档:
只要包含类被子类化,就会调用此方法.然后cls是新的子类.如果定义为普通实例方法,则此方法将隐式转换为类方法.
所以我开始尝试一下,按照文档中的示例:
class Philosopher:
def __init_subclass__(cls, default_name, **kwargs):
super().__init_subclass__(**kwargs)
print(f"Called __init_subclass({cls}, {default_name})")
cls.default_name = default_name
class AustralianPhilosopher(Philosopher, default_name="Bruce"):
pass
class GermanPhilosopher(Philosopher, default_name="Nietzsche"):
default_name = "Hegel"
print("Set name to Hegel")
Bruce = AustralianPhilosopher()
Mistery = GermanPhilosopher()
print(Bruce.default_name)
print(Mistery.default_name)
Run Code Online (Sandbox Code Playgroud)
生成此输出:
Called __init_subclass(<class '__main__.AustralianPhilosopher'>, 'Bruce')
'Set name to Hegel'
Called __init_subclass(<class '__main__.GermanPhilosopher'>, 'Nietzsche')
'Bruce'
'Nietzsche'
Run Code Online (Sandbox Code Playgroud)
我知道这个方法是在子类定义之后调用的,但我的问题特别是关于这个特性的用法.我也阅读了PEP 487文章,但对我没什么帮助.这种方法在哪里有用?是为了:
另外,我是否需要了解它__set_name__以充分理解其用法?
我想重构一些目前由超类和两个子类组成的代码.
这些是我的课程:
public class Animal {
int a;
int b;
int c;
}
public class Dog extends Animal {
int d;
int e;
}
public class Cat extends Animal {
int f;
int g;
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的代码:
ArrayList<Animal> listAnimal = new ArrayList<>();
if (condition) {
Dog dog = new Dog();
dog.setA(..);
dog.setB(..);
dog.setC(..);
dog.setD(..);
dog.setE(..);
listAnimal.add(dog);
} else {
Cat cat = new Cat();
cat.setA(..);
cat.setB(..);
cat.setC(..);
cat.setF(..);
cat.setG(..);
listAnimal.add(cat);
}
Run Code Online (Sandbox Code Playgroud)
如何重构有关公共属性的代码?
我想要这样的东西:
Animal animal = new Animal();
animal.setA(..);
animal.setB(..);
animal.setC(..); …Run Code Online (Sandbox Code Playgroud) 有A类:
@interface ClassA : NSObject {
}
@property (nonatomic, assign) id prop1;
@end
@implementation
@synthesize prop1;
@end
Run Code Online (Sandbox Code Playgroud)
然后我有子类
@interface ClassB : ClassA {
}
@end
@implementation
- (id)init {
self = [super init];
if (self) {
}
return self;
}
//This is infinite loop
- (void) setProp1:(id)aProp
{
self.prop1 = aProp;
}
@end
Run Code Online (Sandbox Code Playgroud)
这是无限循环,因为ClassB中的setProp1从ClassB中调用[ClassB setProp1:val].
我已经尝试过调用[super setProp1]但是这个
如何覆盖@property并在覆盖的setter中分配值?我们假设我无法修改ClassA.
我做了一个UIView具有固定框架的子类.那么,我可以覆盖init而不是initWithFrame:吗?例如:
- (id)init {
if ((self = [super initWithFrame:[[UIScreen mainScreen] bounds]])) {
self.backgroundColor = [UIColor clearColor];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
Xcode文档-initWithFrame:说:"如果以编程方式创建视图对象,则此方法是类的指定初始化程序UIView.子类可以重写此方法以执行任何自定义初始化,但必须super在其实现开始时调用."
"指定初始化程序"是什么意思?
这是一个示例类的布局,有人可以指导我在创建NSObject的子类时的最佳实践吗?
class MyClass: NSObject {
var someProperty: NSString! = nil
override init() {
self.someProperty = "John"
super.init()
}
init(fromString string: NSString) {
self.someProperty = string
super.init()
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的,我在这里遵循最佳做法吗?
我想知道我是否正确设置了初始化器(一个将字符串设置为默认值,一个我可以传入一个字符串)?
我应该super.init()在每个初始化器的末尾调用吗?
我的更具体(带字符串的那个)初始化器是否应该self.init()在最后调用而不是super.init()?
在子类化时,在Swift中设置初始值设定项的正确方法是什么NSObject? - 我该如何调用super init?
这个问题(尽管在目标C中)建议你应该有一个init,你总是调用它,只需在更具体的内容中设置属性:Objective-C Multiple Initialisers
subclass ×10
ios ×4
python ×3
swift ×3
java ×2
superclass ×2
class ×1
dictionary ×1
inheritance ×1
init ×1
metaclass ×1
nsobject ×1
objective-c ×1
oop ×1
overriding ×1
python-3.6 ×1
uikit ×1
uiview ×1