由于信号:分段错误:11,在发射IR SIL函数时命令失败。

9

我想在UITextView的扩展中添加闭包属性,因此我使用typealias定义了一个闭包:

typealias TextViewHeightDidChangedClosure = (_ currentTextViewHeight:CGFloat)->Void

extension UITextView{

  func setTextViewHeightDidChanged(textViewHeightDidChanged:TextViewHeightDidChangedBlock){
    objc_setAssociatedObject(self, &TextViewHeightDidChangedBlockKey, textViewHeightDidChanged, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY_NONATOMIC)
  }

  func textViewHeightDidChanged()->TextViewHeightDidChangedBlock?{
   let textChanged : ((CGFloat)->Void) = objc_getAssociatedObject(self, &TextViewHeightDidChangedBlockKey) as! TextViewHeightDidChangedBlock
    return textChanged
  }

}

但它告诉我一个错误,说:

由于信号而失败的命令:分段错误:11。

这是一个错误的图片。

my code

有人能告诉我为什么并给出一个深刻而有意义的解释吗?非常感谢!

5个回答

10

如果您在类中声明了一个 Bool! 属性,并尝试使用该属性进行三元条件运算,也可能会出现此错误:

var isSomething: Bool!

func myFunc() {
    let value = isSomething ? "something" : "not"
}

只需在您的属性上添加!

var isSomething: Bool!

func myFunc() {
    let value = isSomething! ? "something" : "not"
}

为什么三目运算符会导致段错误? - Tyler
@Tyler 如果 isSomething 为 nil,则强制解包隐式可选项 isSomething! 将导致段错误。 - andrewz

5
通常情况下,遇到 SegFault 11 错误是编译器的一个 bug,建议您发送一个错误报告

大多数这样的 bug 可以通过修复您的代码来解决。

您代码中最明显的问题是 Swift 中通常的闭包(@convention(swift) -- 通常省略)不能传递给代表 Objective-C 的 idAny。请使用在 Swift 书籍这个部分)中被标记为与 id 兼容的 @convention(block)

typealias TextViewHeightDidChangedBlock = @convention(block) (_ currentTextViewHeight:CGFloat)->Void

你可能已经尝试过这个方法,但在这种情况下,仅仅使用@convention(block)是无法解决问题的。
看起来需要另一个诀窍才能让你的代码正常工作,需要明确地将其转换为AnyObject
extension UITextView{

    func setTextViewHeightDidChanged(textViewHeightDidChanged: @escaping TextViewHeightDidChangedBlock){
        objc_setAssociatedObject(self, &TextViewHeightDidChangedBlockKey, textViewHeightDidChanged as! AnyObject, objc_AssociationPolicy.OBJC_ASSOCIATION_COPY_NONATOMIC)
    }

    func textViewHeightDidChanged()->TextViewHeightDidChangedBlock?{
        let textChanged : ((CGFloat)->Void) = objc_getAssociatedObject(self, &TextViewHeightDidChangedBlockKey) as! TextViewHeightDidChangedBlock
        return textChanged
    }

}

所以,这似乎是关于id-as-Any的缺陷。代表idAny应该接受与id-compatible兼容的闭包。我不确定苹果公司会很快修复这个bug,但无论如何,根据我的测试,上述代码都能正常工作。

3

我的问题是由于我在泛型类中声明了两个扩展协议并在类声明中实现它们。 我正在使用xCode 9和Swift 4。


1
我知道这是老话题了,但很想看一下你所谈论的东西的小例子。 - David James

0
在我的情况下,我在Objective-C中引用的Swift类缺少@objc。我在.h文件中使用了@class并在头文件中引用了Swift类。这可能会帮助某些人,因为错误没有提供任何关于此的线索。

0

我在Xcode 9.3中遇到了类似的问题,我打开了错误图像中提到的Swift类(我的不同),进入了错误中提到的方法,那里有以下代码:

class func makeViewCircular(view: AnyObject) {
    let viewCircle = view
    viewCircle.layer.cornerRadius = view.frame.size.width/2
    viewCircle.layer.borderColor = UIColor.clear.cgColor
    viewCircle.layer.borderWidth = 1.0
}

所以,我将代码编辑为以下内容。问题已经解决了。问题出在 AnyObject 类型上。我将 AnyObject 强制转换为 UIView。
class func makeViewCircular(view: AnyObject) {
    if let viewCircle = view as? UIView{
        viewCircle.layer.cornerRadius = view.frame.size.width/2
        viewCircle.layer.borderColor = UIColor.clear.cgColor
        viewCircle.layer.borderWidth = 1.0
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接