invalid conversion from int to UIBarStyle, objective-c++ - iphone

I am trying to integrate a popular iphone module(ShareKit).
The module builds and works fine in the provided sample project.
I've added the appropriate files to my project and it won't compile.
I suspect it's due to some project settings of my project.
most of errors are
Invalid conversion from 'int' to 'UIBarStyle'
Cannot convert 'UIInterfaceOrientation' to 'UIDeviceOrientation' in assignment
Invalid conversion from 'void*' to 'UIAccessibilityTraits*'
I've googled and it seems no similar errors were reported related to Sharekit.
Any guess on what setting is messing up the conversion?
I'm mixxing c++ / object-c in my project.

I guess it's because c++ is more strict on type checking than pure objective-c.
just type-casted them all.

Related

Avoid compiling Swift files for a single target

I have a large Xcode project, with a mixed Swift and Objective C codebase. One of my targets is a QuickLook plugin, which does not use any Swift files.
When building the QuickLook target, each Swift file with references to ObjC classes (correctly bridged in the main target) report "Cannot find type in scope" errors — even though none of those Swift classes are included in the given target.
I've tried changing SWIFT_COMPILATION_MODE to singlefile for both release and debug, but it didn't help. To be absolutely sure that no Objective C classes import any Swift files in this target, I've also set up a preprocessor macro to guard the inclusion of Project-Swift.h files. I can't find a flag to completely skip Swift compilation phase when building.
Are Swift they automatically compiled no matter what I do and regardless of their target membership?
For anyone else struggling with this in the future:
When QuickLook extensions are compiled, even for the simulator, it tries to compile any other targets that might include it. I had an old build target, which was no longer maintained. At some point, the bridging header of that target had fallen behind the actual project, and for some reason, Xcode threw an error for every Swift class.
Go through all any targets that include your extension, even tests, and make sure those compile correctly, or remove those altogether.
The errors were not associated with that particular target in the logs or in the UI, which is probably an Xcode bug.

SCRecorder with Swift 2.1 - Cast from 'MDLMaterialProperty?!' to unrelated type

When I import the SCRecorder in my project, and compile, I start to receive the Cast from 'MDLMaterialProperty?!' to unrelated type warning in a lot of functions in my project.
I don't why I'm receiving this kind of warning and these are creating a lot of inconsistent when running the app.
When I remove the SCRecorder everything runs fine.
Anyone can help me?
Using XCode 7.1 with swift 2.1.

How would a closed-source (i.e. precompiled) Swift library work without headers?

In C, C++ and Objective-C you can compile part of an executable into its own "object file" and use it (and/or a library containing multiple object files) from any other code by including a "header file". Highly-templatized C++ code notwithstanding, a "header" typically contains just the declarations needed to validate the correctness of calling code (and assist the IDE with autocomplete, etc.).
But Swift does not have header files.
Now, apparently it is not currently possible to make a Swift static library, but in the future how would a situation like the above work, wanting to use some existing precompiled code from "new" source code, given that Swift does not have headers?
Would it work something like how [I infer] Java must work, where the compiled form can be introspected enough for the compiler to verify it is being used properly? Does Bitcode in addition to its intermediate representation also provide the necessary "protocol" for retaining such metadata?
If Apple were to port Cocoa to Swift (and keep it closed source), how would it then be "imported" into Swift apps?
Although, really, this question is not anything to do with "closed source" per se but rather trying to understand the boundaries around compilation units in Swift. Based on a similar question for the Go language, mine here could be re-phrased as: can you link to a pre-compiled Swift library without the source?
Well, just consider Apple's Swift libraries. They are closed-source, and you can use them fine and you can see pseudo-"headers" for the stuff in the library in the compiler. The exact mechanism of how this works is not currently publicly documented, but it must exist.
In addition to #user102008, the good new is, Swift will be open sourced by the end of this year, and even ported to Linux by Apple. While we can't guarantee it will always work that way (as Apple has poor records on those kind of issues), people will found suitable solutions within this even if Apple has no interests in doing so.
Even more, afaik, Swift objects were actually Objective-C objects. There'll not be that different to make Swift things work than Objective-C. (More details: http://www.eswick.com/2014/06/inside-swift/) After they were compiled, just do a class dump (or load it into a debugger such as IDA) and you can easily create a .h to make it work like normal static library or a framework.

GCDAsyncSocket in Swift with compile error

I want to use GCDAsyncSocket in Swift, but get the "unresolved identifier 'GCDAsyncSocket'" compiler error. I have imported GCDAsyncSocket.framework but I can't get rid of this error.
I'm sure you've added the framework to your bridging header. But have you checked to make sure the framework is added to the same targets as the Swift file you're trying to use it in?
I typically see this type of compiler error when I have a dependency in my Swift file that doesn't have matching targets. Pretty much the compiler can't think of a better way to tell you this.

Building pure Swift Cocoa Touch Framework

I'm exploring Swift with Xcode-6 and so far so good although I think the new collections need a little bit of work as I've managed to break the compiler a few times.
Problem is I'm now stuck trying to create the framework package to then use in another project. The project builds without issue and all tests pass successfully. When I go to create Archive (which I assume is what is required) I receive the error:
:0: error: underlying Objective-C module 'Sample' not found
Now I assume this has something to do with the contents of my Sample.h which tells me
// In this header, you should import all the public headers of your framework using statements like #import <Sample/PublicHeader.h>
which is fine except I have only used swift enums, structs and classes for this framework so therefore no .h files exist.
Can anyone shed some light on this one as I can't find any documentation available yet?
EDIT (7/27/2018)
The information in the answer below may no longer be accurate. Your mileage may vary.
I sat down with an engineer and asked this exact question. This was their response:
Xcode 6 does not support building distributable Swift frameworks at this time and that Apple likely won't build this functionality into Xcode until its advantageous for them to do so. Right now, Frameworks are meant to be embedded in your app's project, rather than distributed. If you watch any of the session videos or see the sample projects, this is always the arrangement. Another reason is that Swift is very new and likely to change. Thus your Swift-based framework is not guaranteed to work on the platform you originally built it on.
Slight Update
The engineer mentioned that it's not impossible to make a framework for distribution, just that it's not supported.
I was able to get past the error by going to the target for the framework and on the Build Phases tab under Headers, remove the MyFramework.h file
However I was getting the "Underlying Objective-C module not found" error when I was using a framework to share code between a containing app and an app extension, both of which were pure Swift.
Assuming you are creating a truly pure Swift module, you must disable the Objective-C Compatibility Header and any generated interface headers so the compiler doesn't go off assuming it can find an Objective-C module for the framework.
Do Not remove your public framework header. You'll get a module-map warning at link time if you do.
You might find this useful: Creation of pure swift module
In short: it's possible to make static framework, but there is one issue: it doesn't work in end user' project if "ProjectName-Swift.h" header included.
But, it works fine if you use only swift.
I think it's a bug in XCode 6, or that Apple does not allow archiving the Framework from XCode while in beta.
If you compile to profile XCode generates the framework correctly. (See the Release folder created in DerivedData)