<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 2, 2016, at 9:44 AM, Rick Aurbach via swift-users <<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="" style="font-family: ArialMT;">Does anyone know if it is possible to do the following in Swift 3.x? (I’ll describe the issue abstractly first, then give the use-case.)</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">Consider two modules: A and B. A could be either the main module of an application or an embedded framework. B is a different embedded framework.</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">Now A contains an public extension of class X which contains a function f(). Inside B, there is a reference to X.f(). Now what I want to do in f() is to access information (a module name or bundle name or bundle ID or something) that allows me to construct a Bundle object referring to B, without f() having any external knowledge of the organization of the application.</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">The use-case I’m thinking about is a localization extension of String that works in a multi-framework application architecture without requiring the caller to specify the name of the framework and/or module.</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">I.e., I want to write</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;"><span class="Apple-tab-span" style="white-space:pre">        </span>extension String {</div><div class="" style="font-family: ArialMT;"><span class="Apple-tab-span" style="white-space:pre">                </span>func locate() -> String {…}</div><div class="" style="font-family: ArialMT;"><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">and put this extension into framework “A”. Then, from framework “B”, I want to use this function from within a function f() and [somehow] figure out from the runtime what the bundle of “B” is, so that I can use it’s localized strings file.</div><div class="" style="font-family: ArialMT;"><br class=""></div><div class="" style="font-family: ArialMT;">I understand that from within the locate() method, I can use #function and from it, parse out the module name of “A” and then use the correspondence between module names and framework names to figure out the bundle of “A”. BUT what I want here is the bundle resource for “B”, not “A”.</div></div></div></blockquote><br class=""></div><div>You should be able to use a trick similar to the one that assert() uses to collect file and line numbers:</div><div><br class=""></div><div> func locate(caller: StaticString = #function) {</div><div> // `caller` is the caller's #function</div><div> }</div><br class=""><div class=""><br class=""></div><div class="">-- </div><div class="">Greg Parker <a href="mailto:gparker@apple.com" class="">gparker@apple.com</a> Runtime Wrangler</div><div class=""><br class=""></div><div class=""><br class=""></div></body></html>