Swift编译器在构build时分段错误

在我的UIViewExtension.swift文件中添加一个(方便的)计算height属性到UIView是导致Swift编译器segfault …这里可能会出错?

 0 swift 0x00000001061e5608 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x00000001061e5af4 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff894da5aa _sigtramp + 26 3 libsystem_platform.dylib 0xb03939841e997c88 _sigtramp + 2504775416 4 swift 0x00000001064c8bb9 swift::NominalTypeDecl::getMembers(bool) const + 41 5 swift 0x00000001055efab9 swift::irgen::ClassMetadataLayout<(anonymous namespace)::FindClassMethodIndex>::addClassMembers(swift::ClassDecl*) + 329 6 swift 0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper<swift::SILFunctionType>, swift::ResilienceExpansion) + 434 7 swift 0x00000001056550d3 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 42611 8 swift 0x000000010564a266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678 9 swift 0x00000001055cb6f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184 10 swift 0x00000001056376e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859 11 swift 0x0000000105638033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51 12 swift 0x00000001055aa65a frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4842 13 swift 0x00000001055a935d main + 1533 14 libdyld.dylib 0x00007fff8a82e5fd start + 1 

 1. While emitting IR SIL function @_TFCSo6UIViewg6heightSd for 'anonname=0x7ff422892fd0' at <path redacted>/UIViewExtension.swift:60:5 <unknown>:0: error: unable to execute command: Segmentation fault: 11 <unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation) Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254 

如果需要更多的信息来解决这个问题,只需评论。 谢谢!

编辑:

这是一个相关的.xcodeproj,返回这个问题的编译器错误。 在这里下载

我有这个错误,因为我这样做:

 if(currentMeal?.State == .Deleted){ } 

代替

 if(currentMeal!.State == .Deleted){ } 

所以我觉得可选不解开,如果条件可以导致这个错误

当你在Swift中遇到编译器段错误时,你不会得到一个方便的行号和错误信息。 以下是您可以如何跟踪问题的方法:

  1. 在您的项目中创build一个名为SegFaultDebugger.swift的新文件。
  2. 在这个新文件中,定义一个给你提供问题的类的扩展。
  3. 将一组方法从主文件移到SegFaultDebugger.swift
  4. 编译。

在这一点上,发生三件事之一:

  • 您仍然可以在原始文件中获得segfault :将方法从SegFaultDebugger.swift回原始文件,并将不同的方法移入SegFaultDebugger.swift 。 重复
  • 你在SegFaultDebugger.swift得到了段SegFaultDebugger.swift :太好了! 现在使用二进制search将segfault固定到一个特定的方法,直到你可以找出什么构造造成它。
  • 你得到有意义的编译器错误 :太棒了 修复错误。 一旦编译完成,将你的方法移回原始文件。

我得到这个错误,同时扩展我的协议之一,错误types和可选types的参数。

 protocol SomeProtocolName: class { var someProtocolVariable: String { get set } func someProtocolFunction(someProtocolVariable: String) } // MARK: extension SomeProtocolName { func someProtocolFunction(someProtocolVariable: String?) { self.someProtocolVariable = someProtocolVariable } } 

原型和String?中函数参数的区别String? 在扩展造成分段错误11

我也有这个错误,我解决这个问题:

检查你的项目,找出哪些文件被使用两次,删除一个,或者删除并重新添加。

我的Xcode错误:

:0:error:filename“AttributedString.swift”使用两次:'/Users/…/CNJOB/CNJOB/AttributedString.swift'和'/Users/…/CNJOB/CNJOB/AttributedString.swift'

:0:注意:文件名用于区分具有相同名称的私有声明

:0:错误:文件名“APIClient.swift”使用两次:'/Users/…/CNJOB/CNJOB/APIClient.swift'和'/Users/…/CNJOB/CNJOB/APIClient.swift'

:0:注意:文件名用于区分具有相同名称的私有声明

命令/应用程序/ Xcode 3.app /内容/开发/工具链/ XcodeDefault.xctoolchain / usr / bin / swiftc失败,退出代码1

在Xcode 7中,您可以单击Debug Navigator中的错误,并显示崩溃的扩展视图。 点击右侧的汉堡包button会展开错误信息,如果您一直向下滚动到展开的错误消息的底部,您将会看到它来自哪里。

在这里输入图像说明

对我来说,我有两个分段错误错误。 在上图中,第一个是折叠时的样子,第二个是展开汉堡button。 在展开的灰色框的最底部,您会看到一条消息,指出编译器崩溃的位置。

但是请注意,错误消息有时可能不够丰富,所以虽然它告诉你它在哪里崩溃,但并不总是说为什么以及如何解决它。 摆脱这个错误仍然是一个猜测的问题。

我发现了一个简单的解决方法,直到问题在未来的Xcode / Swift版本中得到解决:

  • 只需将导致问题的所有扩展名.swift正在使用的.swift文件中。

在您提供的示例项目中,将 UIViewExtension.swift CALayerExtension.swift 的内容 放在 AppDelegate.swift 上方

希望这可以让我们编写工作的 Swift代码,直到问题解决。

至于我,添加private静态variables固定铛崩溃:

 private static var taskId = 0 

我有一个像这样的语句编译器分段错误:

 someFunction(isFlagged ? "String1" : "String2") 

我只是做了一个if-else语句,它的工作原理。

如果将一个展开的Bool声明为一个属性,也可以有这个问题

在我的情况下,在string插值过程中错位冒号破坏了我的(XCode 6.1.1)。

例:

 println("\(value1:value2)") 

当我打算这样做的时候:

 println("\(value1) : \(value2)") 

这个错误发生在我尝试覆盖父类的弱variables时。

在基类中:

 weak var stripeViewDelegate : StripeViewDelegate? = nil 

派生类:

 override weak var stripeViewDelegate : StripeViewDelegate? = nil { didSet { self.stripeView.delegate = stripeViewDelegate } 

当我从派生类中移除=nil时,错误消失了。

我今天发现一些例外

 class func createByAny(instance: Any?) -> ApiCollectionResponse { ... } 

这解决了它:

 class func createByAny(instance: Any) -> ApiCollectionResponse { ... } 

因为“任何”types是任何types的事件“无”,“AnyObject”,可选,… :)它不能是可选的,它已经是可选的。

 typealias Any = protocol<> 

如果您不小心声明了一个与其名称相匹配的variables,也会发生此错误:

  var sectionGroup: sectionGroup? { ... } 

进入这个错误,因为一个运算符函数的外部通用types,例如

 func ==<T>(lhs: Foo, rhs: Foo) -> Bool { return lhs.bar == rhs.bar } 

在我的情况下,删除<T>解决了这个问题。

在我的情况下,我已经声明了一个func struct 。 将struct移到类级解决了这个问题。

现在我写了这个,我记得之前遇到过有关struct func struct问题。 这是不同于分段错误(这似乎成为臭名昭着的Swift 1.2testing版)。 OMG苹果,你在那里做什么?

在我的情况下,这个错误,因为我使用类名variables

 var MYClass : MYClass { get { return..... } } 

这解决了我的问题

 var myClass : MYClass { get { return..... } } 

即时通讯我的情况下,这发生了当我在一个协议不正确的静态初始化。 我find了一种解决方法,但编译器在构build时不应该产生分段错误。

有三个文件涉及。 协议NamedSegues.swift是一个自定义的TableViewController,它实现了包含一个callback的协议,一个自定义的TableViewCell持有对该协议的引用来调用callback。

 //file1 import Foundation protocol NamedSegues { func executeSegueWithId(id: String) -> Void static func getDefault() -> NamedSegues // This was required because of init requirement in CustomCellView } //file2 class CustomController: UITableViewController, NamedSegues { override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath ) as! CustomCellView // Configure the cell... //App logic... cell.parent = self } //Mark: NamedSegues func executeSegueWithId(id: String) ->() { NSLog("Received callback to execute segue: \(id)") // } static func getDefault() -> NamedSegues { // I think this must be where it threw up. return self as! NamedSegues } } //file3 import UIKit class CustomCellView: UITableViewCell { var id: String = "NoName" var parent: NamedSegues = NamedSegues.getDefault() // This is where it was needed. override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { NSLog("Touched id: \(id)") parent.executeSegueWithId(id) // This is where parent was used. } } 

我通过使用了吗?

在协议文件中,file1:删除getDefault()的声明在CustomController中file2:删除getDefault的实现。 在CustomCellView中,file3:

  var parent: NamedSegues? ... parent?.executeSegueWithId(id) 

编译器应该已经抓住了这一点,并给出了一些错误消息,而不是在构build过程中抛出分段错误!

看起来像Swift 2编译器可能还没有准备好黄金时段! 如果这有助于任何人,我得到了一个分段错误:11,由于封闭头中的variablestypes不匹配,特别是在Parse方法PFQuery.query.findObjectsInBackgroundWithBlock

你可以在这里看到更详细的问题: https : //github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

就像@Fjohn所说的那样,这是一个与解包可选项有关的问题(在Xcode 7.0 beta 6和Xcode 7中都有)。 在我的情况下,我不打开可选的可选项(在我的描述符中双引号)。 如果让我们解决了这个问题

双选可能导致分段错误

正如其他人上面写的,对我来说,当我在一个协议上使用扩展,但协议中的方法签名与扩展中的实现不匹配时,发生了这种情况。

在我的情况下,我为实现(在扩展中)添加了一个新参数,但忘记了将其添加到协议中的方法签名中。

这通常发生在编译器没有足够的信息(尽pipe您认为如此)来保证/确定语句或语句中的variables的状态时。

例如,假设你有一个types为[String:String]的字典,用城市名称作为关键字和用逗号分隔的相应邮政编码/邮政编码列表填充。

想象一下,在你的代码的某个地方,你想更新相应的代码列表:

 myDict[town] += newZipCode + "," 

在这种情况下,编译器将响应分段错误,因为town可能不在字典中,因此不能保证上述语句将具有有效值。

为了解决这个问题,你应该把myDict[town]的当前状态存储在一个单独的variables中,这样你就可以key not in dict来处理key not in dict的情况,然后更新给定键的值:

 myDict[town] = guaranteedValue + "," newZipCode + "," 

不幸的是,确定根本原因并不总是直截了当,所以我希望这个简单的例子有所帮助。

Swift 3.0(Xcode 8.1)在协议声明一个可选variables时出现了这个问题,实现者将这个variables作为一个懒惰的初始化variables实现。

错误报告在这里: https : //bugs.swift.org/browse/SR-1825

Xcode 8.2。

@nonobjc协议实现添加到扩展中导致分段错误。 将@nonobjc协议实现移到类实现中。

对于我来说,以下是导致段错误,而type是可选的:

 switch type { case .aType: // Do Something default: break } 

这解决了它:

 switch type { case .Some(.aType): // Do Something default: break } 

我在自定义UITableViewController中遇到了以下方法签名的错误。

 func filterContentForSearchText(searchText: String) 

改为:

 func filterContentForSearchText(searchText: String!) 

解决了这个问题。

我在扩展中遇到同样的问题。 我的扩展有两个方便初始值设定项:

 convenience init(context: NSManagedObjectContext) { let entityDescription = NSEntityDescription.entityForName("PropertyEntity", inManagedObjectContext: context)! self.init(entity: entityDescription, insertIntoManagedObjectContext: context) } convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) { self.init(context: context) property1 = (dictionary["key"] as? String) ?? "" // More properties... } 

为了摆脱错误,我添加了一个实例方法映射(字典:NSDictionary)和分段错误错误消失。

 convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) { self.init(context: context) map(dictionary) } 

对我来说,问题是让我的架构不符合标准。 我已经添加了i386什么的,只是把它设置回默认的xcodeproject拱,它编译好。

我在一个迅速的项目中遇到了同样的问题。 这个问题是一个函数,应该返回一个对象,但没有回报。 在用Obj-C编辑时,这种错误曾经被用来发信号。 Swift中似乎不是这种情况。

它看起来可能是由很多原因造成的。 在我的情况下,这是pch文件 – 当我试图在bridging-header.h导入.pch文件时,我得到了分段错误,我想也许是由PROJECT-swift.h内部引起的。 所以我应该做的是把所有的快速需求都放到.pch和bridgng-header.h另一个const.h和#import "const.h"中。 这是我犯的一个愚蠢的错误,但希望它可以帮助一些随机的人过来。

发现另一种方法来尝试在Argo中使用空结构时出现此错误:

导致分割故障11:

 struct Action { // let foo: String } extension Action: Decodable { static func decode(json: JSON) -> Decoded<Action> { return .MissingKey("foo") } } 

编译就好了:

 struct Action { let foo: String } extension Action: Decodable { static func decode(json: JSON) -> Decoded<Action> { return .MissingKey("foo") } } 

叹。