我正在尝试在Swift项目中导入this library。我正在逐步完成this document和this answer,但没有任何作用。
这是我的screenshot:
这是我的Bridging-Header.h:
//
// Use this file to import your target's 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"
重要的是我在一个文件中有VKConnector类和VKConnectorDelegate协议。也许这就是问题?
//
// 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's 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's 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
我试图将VKConnector头文件拆分为两个--VKConnector类和VKConnectorDelegate,但这不起作用。
我做错了什么?
答案 0 :(得分:11)
您的委托函数名称为VKConnector
,您还有一个名为VKConnector
的类。那是你的冲突。在Objective C中,您的委托方法是VKConnector:withBool:
,但在Swift中,它只是VKConnector
而withBool不是名称的一部分。
如果你遵循Cocoa模式,你的委托方法应该被称为- (void) connector:(VKConnector *)connector withBool:(BOOL)boolean;
答案 1 :(得分:5)
XCode是否创建了桥接头文件,或者您自己创建了文件?
如果您自己创建了桥接头文件,请确保构建设置指向您的文件:
答案 2 :(得分:1)
混合项目中的“未声明类型”错误几乎总是如我在此解释的那样解决:
https://stackoverflow.com/a/24216718/341994
基本上,无论您将自动生成的"...-Swift.h"
头文件导入到Objective-C代码中,您都需要将"VKConnector.h"
导入该文件,列表中的进口
这是违反直觉和令人讨厌的,但它解决了这个问题,事实上如果你仔细观察就会记录下来。
答案 3 :(得分:1)
如果它对任何人有帮助,在我们的项目中,这个问题是由于我们在主项目目标上有一个桥接头和扩展目标上的桥接头引起的。
我们的扩展目标是使用我们主项目中定义的类。这个类是在扩展桥接头中定义的,并且适用于我们的大多数类。
但是,当我们将其中一个类的目标成员资格提供给主项目目标时,我们在该单个文件中收到此错误。修复是为了确保使用的文件都在桥接头文件中。