我遇到了一个涉及Swift简单继承的奇怪问题。我可能会做一些完全愚蠢的事情,所以如果有人有任何建议..提前感谢!
我使用的是最新的XCode 6 GM版本6A313。
以下是两个使Objective-C向后兼容的Swift类。
@objc
public class ObjectA : NSObject {
var testProp: String!
init(testProp: String) {
self.testProp = testProp
}
}
@objc
public class ObjectB : ObjectA {
var testPropB: String!
init(testProp: String, testPropB: String) {
self.testPropB = testPropB
super.init(testProp: testProp)
}
}
然后我在Objective-C代码中初始化并使用该对象。
ObjectB *objectB = [[ObjectB alloc] initWithTestProp: @"TestProp" testPropB: @"TestPropB"];
// This executes correctly and has the correct value
NSLog(@"%@", objectB.testPropB);
// I then pass this newly constructed object to another class that's written in Swift
AnotherClass *anotherClass = [[AnotherClass alloc] init];
[anotherClass someMethod:objectB];
这是Swift类,当我尝试访问继承的属性时,我得到一个EXC_BAD_ACCESS代码1.
@objc
public class AnotherClass : NSObject {
public func someMethod(objectB: ObjectB) {
// This executes and assigns correctly
let prop = objectB.testProp
// This errors out with EXC_BAD_ACCESS error code 1
// In the debugger, objectB.testPropB actually seem to have the correct value
let propB = objectB.testPropB
}
}
答案 0 :(得分:0)
var testProp: String!
没有理由将其作为隐式解包的可选项。您始终在init
初始化它。如果可能,应该是:
let testProp: String
如果在分配后必须是可变的,那么它应该是:
var testProp: String
修复这个问题可能会导致编译器在你做错的地方大喊大叫(可能不在你发布的代码中)。使用!
,无法初始化此值是合法的(稍后您将崩溃)。如果没有!
,编译器将更好地验证您是否初始化了该值。
这一行:
ObjectB *objectB = [[ObjectB alloc] initWithTestProp: @"TestProp", testPropB: @"TestPropB"];
不正确ObjC(还有一个额外的逗号)。我会认为这是一个错字。我不认为会导致合法的C逗号运算符导致错误的初始化程序运行。但也许......至少值得一试,如果你真的有逗号在那里。 (我很确定testPropB:@"..."
不是一个法律表达,所以这有点牵强,但它会与你的症状相符。)
答案 1 :(得分:0)
所以,我最终创建了一个虚拟项目,以在更加可控的环境中测试我的理论。该修复基本上是为了确保ObjectA和ObjectB位于2个单独的Swift文件中。当它们在同一个Swift文件中时,会发生错误。
以下是感兴趣的人的示例代码。
https://github.com/MystKnight/swift-inheritance-test
我不确定为什么会这样,但是对于那里的所有人来说,如果你使用继承,我想将你的文件限制在一个类......