() -> NSNumber なクロージャを渡している。init(factory:) に渡しているクロージャの式が、 () -> Animal であるゆえに、 コンパイルエラーとなる。 ここは、 self の式の型は Animal ではなく Self なので、 () -> Self 型のクロージャを渡さねばならないからだ。fileprivate let decimal: Decimal ということは、現状でも convenience init 経由の NSDecimalNumber のコンストラクトで、 メモリがぶっ壊れる可能性がある・・・?func castCFNumber<T>() -> T { return unsafeBitCast(cfnumber, to: T.self) } slavaはこれを試してみるとこのこと。