2016-12-05 1 views
3

Я хочу, чтобы добавить свойство замкнутости в расширении UITextView так я определяю замыкание с помощью typealias:Сбой команды из-за сигнал: неисправность Сегментации: 11, издавая функцию IR SIL

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

Может кто-нибудь сказать мне, почему и дать мне глубоко значимое объяснение, большое спасибо!

ответ

3

Как правило, сбой SegFault 11 является ошибкой компилятора, и вам лучше отправить bug report.

И большинство таких ошибок можно обойти с исправлением кода.

Наиболее значительно плохая вещь в вашем коде, что обычные замыкания в Swift (@convention(swift) - обычно опущенные) не могут быть переданы в Any, который представляет id из Objective-C. Используйте @convention(block) который указан в качестве id -соместимым в Swift book (this part):

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. Any, который представляет id, должен принять id -compatible закрытие.

Я не уверен, что Apple исправит эту ошибку в ближайшее время, но в любом случае, насколько я проверял, мой код выше работал так, как ожидалось.

9

Вы также можете иметь эту ошибку, если вы объявляете Bool! свойства в классе, и вы пытаетесь сделать трехкомпонентное состояние с этим свойством:

var isSomething: Bool! 

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

Просто добавьте! на вашей собственности

var isSomething: Bool! 

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

Любое понимание того, почему троица вызывает сегрегацию? – Tyler