[swift-users] How to optionally link swift framework into another framework
Jonathan Prescott
jprescott12 at icloud.com
Mon Mar 6 11:16:59 CST 2017
I think the process is the same as C/C++/Obj-C/Obj-C++, except it’s labelled differently for Swift. In Xcode, users set “C Pre-processor Macro Definitions” with things like USE_LOGGING. In Swift, since it doesn’t use the C pre-processor, Xcode has a separate build setting called “Active Compilation Conditions,” as Rien has noted, probably to keeps consistent with the language. Operationally, behavior is the same as C pre-processor defines.
Jonathan
> On Mar 6, 2017, at 12:09 PM, Jakub Bednář via swift-users <swift-users at swift.org> wrote:
>
> Hi Rien,
>
> looks like a good way around my problem.
>
> Still I wonder why this does not work in Swift as it does work in Objective-C or even in strongly typed checked C++.
>
> Maybe it is some kind of Swift’s security measure to avoid hard-to-debug bugs in C++ caused by virtual table inconsistencies.
>
> Anyway, thanks for the help.
>
> J.
>
>
>> On Mar 6, 2017, at 6:01 PM, Rien <Rien at Balancingrock.nl> wrote:
>>
>> Well, that was a bit short…
>>
>> When you want to use logging, define the ACC “USE_LOGGING” in the build settings.
>> When you don’t want to use logging, don’t define the ACC.
>>
>> PS: You can get my logging framework from github: https://github.com/Balancingrock/SwifterLog
>>
>> Regards,
>> Rien
>>
>> Site: http://balancingrock.nl
>> Blog: http://swiftrien.blogspot.com
>> Github: http://github.com/Balancingrock
>> Project: http://swiftfire.nl
>>
>>
>>
>>
>>
>>> On 06 Mar 2017, at 17:58, Rien <Rien at Balancingrock.nl> wrote:
>>>
>>> You need conditional compilation.
>>>
>>> Called “Active Compilation Conditions” in the build settings.
>>>
>>> For example define a ACC of “USE_LOGGING”
>>>
>>> Then in your code:
>>>
>>> #if USE_LOGGING
>>>
>>> import Logging
>>>
>>> #else
>>>
>>> struct Logging {
>>> func debug(message: string) {}
>>> }
>>>
>>> #endif
>>>
>>>
>>>
>>>
>>> Regards,
>>> Rien
>>>
>>> Site: http://balancingrock.nl
>>> Blog: http://swiftrien.blogspot.com
>>> Github: http://github.com/Balancingrock
>>> Project: http://swiftfire.nl
>>>
>>>
>>>
>>>
>>>
>>>> On 06 Mar 2017, at 17:26, Jakub Bednář via swift-users <swift-users at swift.org> wrote:
>>>>
>>>> Hello everyone,
>>>>
>>>> I am trying to add optional logging into my framework, but for sake of this question, lets assume I want to add optional logging into an app. I have created an example with following setup:
>>>>
>>>> 1. Logging.framework declares
>>>>
>>>> public protocol Logging {
>>>> func debug(message: String)
>>>> }
>>>>
>>>> and I have build the framework for the app to see it.
>>>>
>>>> 2. Application has
>>>>
>>>> import Logging
>>>>
>>>> public class Engine {
>>>>
>>>> let logger: Logging?
>>>>
>>>> public init(withLogger logger: Logging? = nil) {
>>>> self.logger = logger
>>>> }
>>>>
>>>> public work() {
>>>> self.logger?.debug(“Working”)
>>>> }
>>>> }
>>>>
>>>> Now I don’t have the Logging.framework in Embed Binaries nor Link Frameworks lists. My app builds ok, but then fails to start telling me that Logging.framework was not loaded. I checked the binary using otool -L and Logging.framework is still referenced by the binary. Is there any way how to achieve my goal? This would be trivial with Objective-C and I still can’t figure it out in Swift.
>>>>
>>>> Thanks a lot,
>>>>
>>>> J.
>>>>
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
More information about the swift-users
mailing list