【问题标题】:Techniques to debug issues with swift class in objective c project?在目标 c 项目中使用 swift 类调试问题的技术?
【发布时间】:2016-04-22 18:30:21
【问题描述】:

所以我正在重写一个开源项目,该项目目前的目标是 swift。我认为解决这个复杂项目的最佳方法是一次重写和集成每个类。所以我重写了我的第一个类,并且能够将所有目标 c 类指向 swift 类,并且没有编译错误。

当我去运行程序时,它失败了。我相信这是因为无法创建对象。 swiftclass-swift.h 文件已创建,但我确实必须在其中手动添加一种不会自动创建的方法。是否有关于什么是调试问题的最佳方法的技术或文章?我应该在每次调用新类时创建断点,还是有更好的工作流程来识别问题?

我在类被初始化的地方创建了断点,但我看不到任何明显的东西。此外,我尝试针对该类创建单元测试,但这些单元测试不会运行,因为 xcode 会在运行测试之前尝试编译程序。另请注意,该课程在操场上运行良好。任何帮助或阅读信息将不胜感激。

这是课程:

class DateRange: NSObject, NSCopying {

private var dateFormatter = NSDateFormatter()

var start: NSDate
var end: NSDate
var isEmpty: Bool {
    get {return self.start.self.isEqualToDate(self.end)}
}

init(start: NSDate?, end: NSDate?) {
    self.start = start!
    self.end = end!
    super.init()
}

class func dateRange<DR: DateRange>(start: NSDate?, end: NSDate?) -> DR {
    let dateR = DateRange(start: start, end: end) as! DR

    return dateR
}

func components(unitFlags: NSCalendarUnit, forCalendar calendar: NSCalendar) -> NSDateComponents? {
    self.checkIfValid()

    return calendar.components(unitFlags, fromDate: self.start, toDate: self.end, options: NSCalendarOptions.WrapComponents)
}

func checkIfValid() {
    assert(self.start.compare(self.end) != .OrderedDescending)
}

func containsDate(date: NSDate) -> Bool {
    self.checkIfValid()

    return date.compare(self.start) != .OrderedDescending || self.end.compare(self.start) != .OrderedDescending
}

func intersectDateRange(range: DateRange?) {
    self.checkIfValid()

    if (range!.end.compare(self.start) != .OrderedDescending || self.end.compare(range!.start) != .OrderedDescending) {
        self.end = self.start
        return
    }

    if self.start.compare(range!.start) == .OrderedAscending {
        self.start = range!.start
    }
    if range!.end.compare(self.end) == .OrderedAscending {
        self.end = range!.end
    }
}

func intersectsDateRange(range: DateRange?) -> Bool {
    if range!.end.compare(self.start) != .OrderedDescending || self.end.compare(range!.start) != .OrderedDescending {
        return false
    }
    return true
}

func includesDateRange(range: DateRange?) -> Bool {
    if range!.start.compare(self.start) == .OrderedAscending || self.end.compare(range!.end) == .OrderedAscending { return false
    }
    return true
}

func unionDateRange(range: DateRange?) {
    self.checkIfValid()
    range!.checkIfValid()

    self.start = self.start.earlierDate((range?.start)!)
    self.end = self.end.laterDate((range?.end)!)
}

func enumerateDaysWithCalendar(calendar: NSCalendar?, usingBlock: (day: NSDate?, stop: Bool?) ->()) -> Void {

    let comp: NSDateComponents = NSDateComponents()
    comp.day = 1

    var date: NSDate = self.start
    let stop: Bool = false

    while !stop && date.compare(self.end) == .OrderedAscending {
        usingBlock(day: date, stop: stop)
        date = (calendar?.dateByAddingComponents(comp, toDate: self.start, options: NSCalendarOptions.WrapComponents))!
        comp.day += 1
    }
}

func isEqualToDate(range: DateRange?) -> Bool {
    return range == range!.start.isEqualToDate(self.start) && range!.end.isEqualToDate(self.end)
}

// MARK: - NSObject

func copyWithZone(zone: NSZone) -> AnyObject {
    return DateRange(start: self.start, end: self.end)
}

override func isEqual(object: AnyObject?) -> Bool {
    var isObject = Bool()
    if self.isEqual(object) {
        isObject = true
    }

    if ((object?.isKindOfClass(DateRange)) != nil) {
        isObject = false
    }
    return isObject
}
}

【问题讨论】:

  • 你没有提到它,所以我想我会问,你的桥接头设置是否正确?当你运行它时说“它失败了”,是整个程序失败还是只是调用新类?
  • 标头已创建,我确实必须添加一种未创建的方法。我更新了问题。
  • 你能描述一下失败的原因吗?

标签: ios objective-c swift


【解决方案1】:

每次编译 swift 代码时都会生成该标头。这不是手动编辑的东西。您所做的任何编辑都会在您下次编译时被吹走。

这意味着 某事 关于该声明与目标 c 不兼容。也许它使用了一些 swift-only 功能(如元组),或者它被标记为私有,因此它不会导出到标题。不能说没有实际看到声明。

我会首先将声明修改为更简单,直到它出现在标题中,并确保目标 c 代码在它出现时可以调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多