How to swizzle NSError init without hitting an infinite loop

Multi tool use
How to call the original NSError
init method when swizzling?
My current implementation
extension NSError {
@objc class func errorSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}
@objc class func errorUnSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(swizzleInstance, instance)
}
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
/// infinite loop as it calls the swizzled init again.
self.init(domain: swizzleDomain, code: code, userInfo: info)
/// Do something..
}
}
ios swift nserror method-swizzling
add a comment |
How to call the original NSError
init method when swizzling?
My current implementation
extension NSError {
@objc class func errorSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}
@objc class func errorUnSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(swizzleInstance, instance)
}
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
/// infinite loop as it calls the swizzled init again.
self.init(domain: swizzleDomain, code: code, userInfo: info)
/// Do something..
}
}
ios swift nserror method-swizzling
add a comment |
How to call the original NSError
init method when swizzling?
My current implementation
extension NSError {
@objc class func errorSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}
@objc class func errorUnSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(swizzleInstance, instance)
}
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
/// infinite loop as it calls the swizzled init again.
self.init(domain: swizzleDomain, code: code, userInfo: info)
/// Do something..
}
}
ios swift nserror method-swizzling
How to call the original NSError
init method when swizzling?
My current implementation
extension NSError {
@objc class func errorSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(instance, swizzleInstance)
}
@objc class func errorUnSwizzle() {
guard let instance = class_getInstanceMethod(self, #selector(NSError.init(domain:code:userInfo:))),
let swizzleInstance = class_getInstanceMethod(self, #selector(NSError.init(swizzleDomain:code:info:))) else { return }
method_exchangeImplementations(swizzleInstance, instance)
}
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
/// infinite loop as it calls the swizzled init again.
self.init(domain: swizzleDomain, code: code, userInfo: info)
/// Do something..
}
}
ios swift nserror method-swizzling
ios swift nserror method-swizzling
asked Dec 31 '18 at 12:11


Tal ZionTal Zion
3,0662244
3,0662244
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You have exchanged the implementations, that means you have to call:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
Because self.init(swizzleDomain:...)
will contain the original initializer.
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53987373%2fhow-to-swizzle-nserror-init-without-hitting-an-infinite-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You have exchanged the implementations, that means you have to call:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
Because self.init(swizzleDomain:...)
will contain the original initializer.
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
add a comment |
You have exchanged the implementations, that means you have to call:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
Because self.init(swizzleDomain:...)
will contain the original initializer.
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
add a comment |
You have exchanged the implementations, that means you have to call:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
Because self.init(swizzleDomain:...)
will contain the original initializer.
You have exchanged the implementations, that means you have to call:
@objc convenience init(swizzleDomain: String, code: Int, info: [String : Any]?) {
self.init(swizzleDomain: swizzleDomain, code: code, info: info)
}
Because self.init(swizzleDomain:...)
will contain the original initializer.
edited Dec 31 '18 at 12:24
answered Dec 31 '18 at 12:17


SulthanSulthan
96.2k16156201
96.2k16156201
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
add a comment |
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
Thanks, @Sulthan, just found my issue as well and posted that as an answer
– Tal Zion
Dec 31 '18 at 12:25
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53987373%2fhow-to-swizzle-nserror-init-without-hitting-an-infinite-loop%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5Cs4hpQo9bI5 cAN NA,WxoGIUA5uxP5,22L9Enq2lDh2ALDgd