Using an undeclared type in a Swift project

I am trying to import this library into my Swift project. I do everything step by step from this document and this answer , but nothing works.

Here is my screenshot : enter image description here

Here is my Bridging-Header.h:

// // Use this file to import your target public headers that you would like to expose to Swift. // #import <UIKit/UIKit.h> #import "VKUser.h" #import "VKAccessToken.h" #import "VKCache.h" #import "VKStorage.h" #import "VKStorageItem.h" #import "VKRequestManager.h" #import "VKRequest.h" #import "VKConnector.h" #import "VKMethods.h" #import "NSData+toBase64.h" #import "NSString+Utilities.h" 

The important thing is that I have VKConnector and VKConnectorDelegate protocol in one file. Maybe a problem?

 // // Copyright (c) 2013 Andrew Shmig // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "VKMethods.h" #import "VKAccessToken.h" #import "VKStorage.h" #import "NSString+Utilities.h" #import "VKStorageItem.h" @class VKConnector; static NSString *const kVKErrorDomain = @"kVkontakteErrorDomain"; typedef enum { kVKApplicationWasDeletedErrorCode } kVkontakteErrorCode; /** Protocol incapsulates methods that are triggered during user authorization process or access token status changes. */ @protocol VKConnectorDelegate <NSObject> @optional /** @name Show/hide web view */ /** Method is called when user needs to perform some action (enter login and password, authorize your application etc) @param connector VKConnector instance that sends notifications @param webView UIWebView that displays authorization page */ - (void)VKConnector:(VKConnector *)connector willShowWebView:(UIWebView *)webView; /** Method is called when UIWebView should be hidden, this method is called after user has entered login+password or has authorized an application (or pressed cancel button etc). @param connector VKConnector instance that sends notifications @param webView UIWebView that displays authorization page and needs to be hidden */ - (void)VKConnector:(VKConnector *)connector willHideWebView:(UIWebView *)webView; /** @name UIWebView started/finished loading a frame */ /** Method is called when UIWebView starts loading a frame @param connector VKConnector instance that sends notifications @param webView UIWebView that displays authorization page */ - (void)VKConnector:(VKConnector *)connector webViewDidStartLoad:(UIWebView *)webView; /** Method is called when UIWebView finishes loading a frame @param connector VKConnector instance that sends notifications @param webView UIWebView that displays authorization page */ - (void) VKConnector:(VKConnector *)connector webViewDidFinishLoad:(UIWebView *)webView; /** @name Access token */ /** Method is called when access token is successfully updated @param connector VKConnector instance that sends notifications @param accessToken updated access token */ - (void) VKConnector:(VKConnector *)connector accessTokenRenewalSucceeded:(VKAccessToken *)accessToken; /** Method is called when access token failed to be updated. The main reason could be that user denied/canceled to authorize your application. @param connector VKConnector instance that sends notifications @param accessToken access token (equals to nil) */ - (void) VKConnector:(VKConnector *)connector accessTokenRenewalFailed:(VKAccessToken *)accessToken; /** @name Connection & Parsing */ /** Method is called when connection error occurred during authorization process. @param connector VKConnector instance that sends notifications @param error error description */ - (void)VKConnector:(VKConnector *)connector connectionError:(NSError *)error; /** Method is called if VK application was deleted. @param connector VKConnector instance that sends notifications @param error error description */ - (void) VKConnector:(VKConnector *)connector applicationWasDeleted:(NSError *)error; @end /** The main purpose of this class is to process user authorization and obtain access token which then will be used to perform requests from behalf of current user. Example: [[VKConnector sharedInstance] startWithAppID:@"12345567" permissions:@[@"wall"] webView:webView delegate:self]; */ @interface VKConnector : NSObject <UIWebViewDelegate> /** @name Properties */ /** Delegate */ @property (nonatomic, weak, readonly) id <VKConnectorDelegate> delegate; /** Application unique identifier */ @property (nonatomic, strong, readonly) NSString *appID; /** Permissions */ @property (nonatomic, strong, readonly) NSArray *permissions; /** @name Class methods */ /** Returns shared instances of VKConnector class. */ + (id)sharedInstance; /** @name User authorization */ /** Starts user authorization process. @param appID application unique identifier @param permissions array of permissions (wall, friends, audio, video etc) @param webView UIWebView which will be used to display VK authorization page @param delegate delegate which will receive notifications */ - (void)startWithAppID:(NSString *)appID permissons:(NSArray *)permissions webView:(UIWebView *)webView delegate:(id <VKConnectorDelegate>)delegate; /** @name Cookies */ /** Removes all cookies which were obtained after user has authorized VK application. This method is used to log out current user. */ - (void)clearCookies; @end 

I tried to split the VKConnector header file into two classes VKConnector and VKConnectorDelegate, but this did not work.

What am I doing wrong?

+7
objective-c swift
source share
4 answers

Your delegate function name is VKConnector , and you also have a class called VKConnector . This is your conflict. In Objective-C, your delegate method is VKConnector:withBool: but in Swift it is just VKConnector and with Bool is not part of the name.

If you follow Cocoa patterns, your delegate method should be called - (void) connector:(VKConnector *)connector withBool:(BOOL)boolean;

+11
source share

Did Xcode create the bridge header file, or did you create the file yourself?

If you created the bridge header file yourself, make sure the build settings point to your file:

enter image description here

+3
source share

An “undeclared type” error in a mixed project is almost always resolved, as I explained here:

stack overflow

Basically, wherever you import the automatically generated header file "...-Swift.h" into your Objective-C code, you will need to import "VKConnector.h" into this file, previously in the import list.

This is inconsistent and annoying, but it solves the problem and is actually actually documented if you look very carefully.

+1
source share

If this helps anyone, in our project this problem was caused by the fact that we had a bridge header on the main target of the project and a bridge header for the expansion target.

Our extension target used the class defined in our main project. This class was defined inside the extension header and was used for most of our classes.

However, when we gave the target membership of one of our classes the main goal of the project, we got this error in this single file. The fix was to ensure that the files used were in both header files.

+1
source share

All Articles