Swift beta 6 - 令人困惑的链接器错误消息

DrS*_*ott 58 swift xcode6

我在使用Xcode 6 beta 6构建Swift程序时,从链接器收到一条错误消息,目标是iOS 8.这段代码在beta 5中编译并正确运行.

Undefined symbol for architecture x86_64:
__TFSs26_forceBridgeFromObjectiveCU__FTPSs9AnyObject_MQ__Q_", referenced from:
 __TFC8RayTrace14RayTracingPlot15drawFocalPointfS0_FT_T_ in RayTracingPlot.o
ld: symbol(s) not found for architecture x86_64
Run Code Online (Sandbox Code Playgroud)

这是有问题的代码:

private func drawFocalPoint() {
    var attributes = Dictionary<String, AnyObject>()

    let FString: String = "F"
    let distance: CGFloat = focalDistance

    let centerX = CGRectGetMidX(bounds)
    let centerY = CGRectGetMidY(bounds)

    let circleRadius: CGFloat = 4.0
    let focalPointFrame = CGRectMake(0, 0, circleRadius * 2.0, circleRadius * 2.0)
    var path = UIBezierPath(ovalInRect: focalPointFrame)
    let color = UIColor.blackColor()

    let currentContext = UIGraphicsGetCurrentContext()
    CGContextSaveGState(currentContext)
    let shadowColor = UIColor(white:0, alpha:0.75).CGColor
    CGContextSetShadowWithColor(currentContext, CGSizeMake(0, 4), CGFloat(8), shadowColor)

    // Image F
    var imageFPath = UIBezierPath(CGPath: path.CGPath)
    let imageFTransform = CGAffineTransformMakeTranslation((centerX - distance - circleRadius),
        (centerY - circleRadius))
    imageFPath.applyTransform(imageFTransform)
    color.set()
    imageFPath.fill()
    FString.drawAtPoint(CGPointMake(centerX - distance - circleRadius, centerY + 5), withAttributes:attributes)

    CGContextSetShadowWithColor(currentContext, CGSizeMake(0.0, 0.0), CGFloat(0.0), nil) // Clear shadow
    CGContextRestoreGState(currentContext)
}
Run Code Online (Sandbox Code Playgroud)

我很欣赏有关此代码中查找错误的位置的提示,以便我可以修复它.谢谢.

Pau*_*anu 120

即使使用新版本的Beta6,我发现了这个错误.

我通过删除Derived文件夹的内容解决了这个和其他类似的难以辨认的错误.您可以转到"首选项">"位置"找到该文件夹​​的位置.

默认路径为:/ Users/[您的用户名]/Library/Developer/Xcode/DerivedData

您也可以Option在Xcode中打开产品菜单时按住,这将更Clean改为Clean Build Folder...并完成相同的任务,而无需文件夹搜索.

  • 你可以在Xcode中打开`Product`菜单时按住`Option`,这会将`Clean`改为`Clean Build Folder ...`并完成相同的任务,而不必进行文件夹搜索. (18认同)
  • 好的.删除构建目录就可以了.不能只是Cmd + K来清理它.不得不手动删除它. (2认同)
  • 您也可以使用管理器中项目的派生数据部分中的"删除"按钮("窗口 - >管理器 - >项目 - > <您的项目> - >派生数据") (2认同)

Dav*_*ood 7

这个错误的另一个原因(在Xcode 6.1.1和Xcode 6.2 Beta 3中看到)有一个枚举,在一个类中只有一个case,并在第二个类中声明该类型的变量.

此代码将导致链接器错误:

class ClassA {
    enum ExampleEnum {
        case Option1
    }
}

class ClassB {
    var example: ClassA.ExampleEnum = .Option1
}
Run Code Online (Sandbox Code Playgroud)

这将解决它.

class ClassA {
    enum ExampleEnum {
        case Option1
        case Option2 // Added a second case
    }
}

class ClassB {
    var example: ClassA.ExampleEnum = .Option1
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息和示例项目的雷达:http://openradar.appspot.com/19369147

只有一个案例的枚举在实践中是相当无用的,因此编译器可能正在优化它或其他东西.我在设置一个新项目时使用了枚举,以便稍后确定成就,并且只有一个占位符.

另请注意:使用Watchdog http://watchdogforxcode.com/以避免担心派生数据问题.