在Objective-C类

时间:2015-12-12 20:00:40

标签: ios objective-c xcode swift debugging

我的问题可能很简单,但我迷失了。 任何评论,想法,帮助,预测都会非常有用。

这是我的课程

  

TrialSwiftClass.swift

import Foundation

@objc public class TrialSwiftClass : NSObject{
    var first : String?
    var second : NSString?
    var third : NSNumber = 0


    override init(){
        super.init()
    }

    init(data:NSArray){

            self.first = data[0] as? String
            self.second = data[1] as? NSString
            self.third = data[2] as! NSNumber
    }
}
  

TrialObjectiveCClass.h

#import <Foundation/Foundation.h>

@interface TrialObjectiveCClass : NSObject

@property (nonatomic, strong) NSString *first;
@property (nonatomic, strong) NSString *second;
@property (nonatomic, assign) NSNumber *third;

- (instancetype)initWithArray:(NSArray *)data;

@end
  

TrialObjectiveCClass.m

#import "TrialObjectiveCClass.h"

@implementation TrialObjectiveCClass


- (instancetype)initWithArray:(NSArray *)data{
    self.first = data[0];
    self.second = data[1];
    self.third = data[2];

    return self;
}
@end

现在问题来了。当我在我的ViewController.m中使用这两个类时,其中包含以下代码:

#import "ViewController.h"
#import "TrialObjectiveCClass.h"
#import "Codemaster-Swift.h" //Automatically created header to use Swift code in Objective-C


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *trialArray = @[@"FirstString", @"SecondString", @99];


    //First the Swift part
    TrialSwiftClass *obj = [[TrialSwiftClass alloc] initWithData:trialArray];

    NSLog(@"%@", obj.first);
    NSLog(@"%@", obj.second);
    NSLog(@"%@", obj.third);


    //Now the Objective-C part
    TrialObjectiveCClass *obj2 = [[TrialObjectiveCClass alloc] initWithArray:trialArray];
    NSLog(@"%@", obj2.first);
    NSLog(@"%@", obj2.second);
    NSLog(@"%@", obj2.third);


}

如果我在ViewController.m的最后一个NSLog中放置一个断点,这是我在调试区域中看到的: enter image description here

我的日志显示了对象属性的正确值。

为什么我看不到我的Swift类的层次结构,但可以看到我的Objective-C类?如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

Swift类中的变量作为属性暴露给ObjC。目前,Locals视图不显示对象的属性,仅显示其ivars。无论该类是来自ObjC还是Swift,都是如此。这就是为什么快速变量不会出现在本地视图中的原因。

您可以使用lldb控制台中的expression命令来查看对象的属性。例如,在您的示例中停止,您可以执行以下操作:

(lldb) expr obj.first
(__NSCFConstantString *) $0 = 0x00000001002d1498 @"FirstString"

答案 1 :(得分:0)

在这一点上,您无法看到Swift类的层次结构。当您将swift类桥接到obj-c文件时发生了一些事情,调试器再也看不到您的属性了。这是一个错误或其他什么,我还想不通。但是如果你想看到你的层次结构,你可以在你的Swift文件中看到它。

enter image description here

enter image description here

另一种解决方案,如果您创建一个swift项目并在那里初始化objective-c类。因此,如果您可以以相反的方式创建,则属性和层次结构将显示在调试字段中。

enter image description here

这不是对此的解释,为什么你的解决方案不起作用,但我希望这会对你有所帮助。