Q:

Cannot cast value of type MyClass to MyDelegate

I have a class that needs to set a component to self. That component requires the class to implement a protocol MyDelegate. Eventually, it fails (SIGNAL SIGABRT).
// I need the class to be a NSObject for unrelated requirements 
class MyClass: NSObject {

// I force the compilation, but it then breaks apart at runtime anyway
 private let myComponent = 
 Component(requiresAnObjectofTypeMyDelegate: self as! MyDelegate) 
}

// in the same file 
 extension MyClass: MyDelegate {  
   func myUsefulDelegateCall() {
   } 
 }

Why?

A:

The problem is the usage of self inside the stored property myComponent.
Typically, it is not allowed to hand out self before the initializer has finished intializing the whole object. Therefore, your problem has nothing to do with protocols or extensions. More simple:
import Foundation

class Component {
    init(requiresAnObjectofTypeMyClass:MyClass) {
    }
}

// I need the class to be a NSObject for unrelated requirements 
class MyClass : NSObject {

    // I force the compilation, but it then breaks apart at runtime anyway
    private let  myComponent = 
        Component(requiresAnObjectofTypeMyClass : self as! MyClass)
}

let m = MyClass()

also crashes.
If you leave out the NSObject subclassing, you get a compiler error:

use of unresolved identifier 'self'
              Component(requiresAnObjectofTypeMyClass : self as! MyClass)

This shows the problem: You must not use self here.
I think it's just an Xcode bug; Xcode seems to ignore the syntax error when subclassing NSObject. The cast as! MyClass is also a hint that we are looking for a strange workaround that finally get's Xcode to it's knees and causes the runtime crash.
To work-around, you could create a lazy property, which will be evaluated after the initialization process and therefore will allow self to be handed into the Component initializer:
private(set) lazy var  myComponent = Component(requiresAnObjectofTypeMyClass:self)

Here, you also do not need the cast. Unfortunately, lazy let is not allowed in swift (and nobody knows why), so private(set) is close to it's semantic.
It's easy to transfer this code to your protocol example.

