Swift继承问题 - 无法访问继承的属性

时间:2014-09-17 01:44:09

标签: objective-c inheritance swift xcode6

我遇到了一个涉及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 
    }
}

2 个答案:

答案 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

我不确定为什么会这样,但是对于那里的所有人来说,如果你使用继承,我想将你的文件限制在一个类......