使用协议在 swift 中编写自定义函数
Using protocols to write custom functions in swift
我正在使用一个框架,该框架有一些我想要的委托方法 extend/modify。
对于使用 framework-specific 语言,我深表歉意,但我的问题不在于框架 - 它在于协议和委托的概念。
我对它是如何工作的理解很肤浅,所以你忽略框架并帮助我了解大局也没关系。
我的 class header 实现了以下协议:
class ConversationListViewController: ATLConversationListViewController,
ATLConversationListViewControllerDelegate, ATLConversationListViewControllerDataSource,
LYRQueryControllerDelegate {...}
在ATLConversationListViewController源文件中,存在这个函数:
- (void)configureCell:(UITableViewCell<ATLConversationPresenting> *)conversationCell atIndexPath:(NSIndexPath *)indexPath
{
LYRConversation *conversation = [self.queryController objectAtIndexPath:indexPath];
[conversationCell presentConversation:conversation];
if (self.displaysAvatarItem) {
if ([self.dataSource respondsToSelector:@selector(conversationListViewController:avatarItemForConversation:)]) {
id<ATLAvatarItem> avatarItem = [self.dataSource conversationListViewController:self avatarItemForConversation:conversation];
[conversationCell updateWithAvatarItem:avatarItem];
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Conversation View Delegate must return an object conforming to the `ATLAvatarItem` protocol." userInfo:nil];
}
}
//other conditions for various other delegate methods
}
我可以在我的 ConversationListViewController class 中实现这个 avatarItemForConversation 函数,如下所示:
func conversationListViewController(conversationListViewController:
ATLConversationListViewController!, avatarItemForConversation
conversation: LYRConversation!) -> ATLAvatarItem! {
//implementation goes here
return user as? ATLParticipant
}
我的问题是,当我设置我的头像时,我需要访问特定的 UITableViewCell(它实现了 ATLConversationPresenting 协议)——否则我必须从我的数据库同步下载头像图像,因为我不能明确提及每个单元格使用委托函数的默认参数。
所以我的问题很简单:如何扩展委托函数中可用的信息?
在我的例子中,我可以使用对 UITableViewCell 的引用或当前对话的 indexPath。 我只需要一种方法将对话与其所属的单元格相关联。
我也在研究 Layer+Atlas Framework。我有解决方案
对于 ATLParticipant...
class ConversationParticipant: ConversationAvatarItem, ATLParticipant {
var firstName: String!
var lastName: String!
var fullName: String!
var participantIdentifier: String!
override init() {
super.init()
}
}
对于 ATLAvatarItem...
class ConversationAvatarItem: NSObject, ATLAvatarItem {
var avatarImageURL: NSURL!
var avatarImage: UIImage!
var avatarInitials: String!
override init() {
super.init()
}
}
如何使用
func conversationListViewController(conversationListViewController: ATLConversationListViewController!, avatarItemForConversation conversation: LYRConversation!) -> ATLAvatarItem! {
let lastUser = ConversationAvatarItem()
lastUser.avatarImage = UIImage(named: "ee.png")
return lastUser
}
我正在使用一个框架,该框架有一些我想要的委托方法 extend/modify。
对于使用 framework-specific 语言,我深表歉意,但我的问题不在于框架 - 它在于协议和委托的概念。
我对它是如何工作的理解很肤浅,所以你忽略框架并帮助我了解大局也没关系。
我的 class header 实现了以下协议:
class ConversationListViewController: ATLConversationListViewController,
ATLConversationListViewControllerDelegate, ATLConversationListViewControllerDataSource,
LYRQueryControllerDelegate {...}
在ATLConversationListViewController源文件中,存在这个函数:
- (void)configureCell:(UITableViewCell<ATLConversationPresenting> *)conversationCell atIndexPath:(NSIndexPath *)indexPath
{
LYRConversation *conversation = [self.queryController objectAtIndexPath:indexPath];
[conversationCell presentConversation:conversation];
if (self.displaysAvatarItem) {
if ([self.dataSource respondsToSelector:@selector(conversationListViewController:avatarItemForConversation:)]) {
id<ATLAvatarItem> avatarItem = [self.dataSource conversationListViewController:self avatarItemForConversation:conversation];
[conversationCell updateWithAvatarItem:avatarItem];
} else {
@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"Conversation View Delegate must return an object conforming to the `ATLAvatarItem` protocol." userInfo:nil];
}
}
//other conditions for various other delegate methods
}
我可以在我的 ConversationListViewController class 中实现这个 avatarItemForConversation 函数,如下所示:
func conversationListViewController(conversationListViewController:
ATLConversationListViewController!, avatarItemForConversation
conversation: LYRConversation!) -> ATLAvatarItem! {
//implementation goes here
return user as? ATLParticipant
}
我的问题是,当我设置我的头像时,我需要访问特定的 UITableViewCell(它实现了 ATLConversationPresenting 协议)——否则我必须从我的数据库同步下载头像图像,因为我不能明确提及每个单元格使用委托函数的默认参数。
所以我的问题很简单:如何扩展委托函数中可用的信息?
在我的例子中,我可以使用对 UITableViewCell 的引用或当前对话的 indexPath。 我只需要一种方法将对话与其所属的单元格相关联。
我也在研究 Layer+Atlas Framework。我有解决方案
对于 ATLParticipant...
class ConversationParticipant: ConversationAvatarItem, ATLParticipant {
var firstName: String!
var lastName: String!
var fullName: String!
var participantIdentifier: String!
override init() {
super.init()
}
}
对于 ATLAvatarItem...
class ConversationAvatarItem: NSObject, ATLAvatarItem {
var avatarImageURL: NSURL!
var avatarImage: UIImage!
var avatarInitials: String!
override init() {
super.init()
}
}
如何使用
func conversationListViewController(conversationListViewController: ATLConversationListViewController!, avatarItemForConversation conversation: LYRConversation!) -> ATLAvatarItem! {
let lastUser = ConversationAvatarItem()
lastUser.avatarImage = UIImage(named: "ee.png")
return lastUser
}