On Apple platforms, we'd probably prefer you use the little-known #dsoHandle, a 
magic pointer that's unique to the current dylib. Parsing out a module name 
seems incredibly brittle; the form of #function is not guaranteed to be stable 
or useful across Swift versions.

Jordan


> On Dec 2, 2016, at 10:35, Rick Aurbach via swift-users 
> <swift-users@swift.org> wrote:
> 
> That’s clever! Thank you; I’d probably never have thought of that.
> 
> Cheers,
> 
> Rick Aurbach
> 
>> On Dec 2, 2016, at 12:25 PM, Greg Parker <gpar...@apple.com 
>> <mailto:gpar...@apple.com>> wrote:
>> 
>>> 
>>> On Dec 2, 2016, at 9:44 AM, Rick Aurbach via swift-users 
>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>> 
>>> 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.)
>>> 
>>> 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.
>>> 
>>> 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.
>>> 
>>> 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.
>>> 
>>> I.e., I want to write
>>> 
>>>     extension String {
>>>             func locate() -> String {…}
>>>     }
>>> 
>>> 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.
>>> 
>>> 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”.
>> 
>> You should be able to use a trick similar to the one that assert() uses to 
>> collect file and line numbers:
>> 
>>     func locate(caller: StaticString = #function) {
>>         // `caller` is the caller's #function
>>     }
>> 
>> 
>> -- 
>> Greg Parker     gpar...@apple.com <mailto:gpar...@apple.com>     Runtime 
>> Wrangler
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to