Tag: 协议

编译器在Swift iOS中为一个协议分配委托时出错

我有一个问题,委派一个对象是一个类的实例,在Swift中定义一个协议,如下所示: 我将代码简化为简单的例子来说明问题:这是协议类 protocol TheProtocol { func notifyDelegate() } class ClassWithProtocol: NSObject { var delegate: TheProtocol? fire() { delegate?.notifyDelegate() } } 这是符合协议的类 class ClassConformingToProtocol: NSObject, TheProtocol { var object: ClassWithProtocol? func notifyDelegate() { println("OK") } init() { object = ClassWithProtocol() object?.delegate = self // Compiler error – Cannot assign to the result of this expression object?.fire() […]

使用JSON编码器将types为Codable的variables编码

我设法得到JSON和P列表编码和解码工作,但只能直接调用特定对象的编码/解码function。 例如: struct Test: Codable { var someString: String? } let testItem = Test() testItem.someString = "abc" let result = try JSONEncoder().encode(testItem) 这工作正常,没有问题。 但是,我想获得一个函数,只接受Codable协议一致性types并保存该对象。 func saveObject(_ object: Encodable, at location: String) { //Some code let data = try JSONEncoder().encode(object) //Some more code } 这会导致以下错误: 无法用types为“(Encodable)”的参数列表调用“encode” 看着编码函数的定义,好像应该可以接受Encodable,除非Value是一些我不知道的奇怪types。 open func encode<Value>(_ value: Value) throws -> Data where […]

在NSObject上使用类别提供默认协议实现有什么问题?

我一直在寻找一种方法来使用可选的协议方法,并有干净的代码。 换一种说法: 1:No respondsToSelector:全部调用我的代码 2,应该为任何方法签名工作,所以NSObject做检查和调用performSelector:的类别方法是out(和NSInvocation有问题与ARC合作) 3:这个解决scheme ,国际海事组织,假装是普遍的,但具有1的所有缺点 我最终想出了这个想法: @protocol MyProtocol <NSObject> @optional -(void)optionalMethod; @end @interface ClassA : NSObject <MyProtocol> @end @implementation ClassA -(void)optionalMethod{ NSLog(@"ClassA implements optionalMethod"); } @end @interface ClassB : NSObject <MyProtocol> @end @implementation ClassB //classB does not implement optionalMethod @end @interface NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod; @end @implementation NSObject (DefaultMyProtocolImplementation) -(void)optionalMethod{ NSLog(@"%@ does not implement […]

iOS >>协议和委托的概念

在networking上有很多关于协议和代表的资料,不同的教程通过不同的名字来呼叫过程中的一些“参与者”。 尤其令人困惑的是“Adapter”和“Conformer”的概念。 据我所知,正在实现Protocol方法的类 – 即具有<ProtocolName>语句的类 – 是“符合协议”。 这也是协议的“采用者”吗? 我如何调用协议在其中声明或重新声明的类,以便它可以包含必须符合协议的属性 – 即在其接口中具有@protocol ProtocolName语句? 我找不到解释这个的苹果官方文档。 编辑 伙计们,谢谢你给出的答案,但是我确实(并且确实)理解了模式,以及它是如何在语言中实现的。 我的问题是(现在仍然是)与命名有关…仍然没有提到“宣布/重新join议定书的名称(概念上)是什么”。 也许它没有名字,我应该把它称为:“议定书申报/重新申报的类别”。 也许我可以称之为“授权class”(听起来不错,顺便说一下)…

“#selector”的参数不涉及初始值设定项或方法

我有一个名为selectionDidFinish(controller:)在委托方法closuresviewController委托给出。 呈现的控制器,采用我的UIBarButtonItem协议,有一个UIBarButtonItem与一个动作附加它应该调用selectionDidFinish(controller:)方法,但它给了我“的参数#select器不参考”初始化或方法“错误。 这个错误是在这个呈现的UIViewController : class FormulaInfoViewController: UIViewController, Dismissable { weak var dismissalDelegate: DismissalDelegate? override func viewDidLoad() { super.viewDidLoad() // Xcode doesn't like this selector navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(dismissalDelegate?.selectionDidFinish(self))) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 我已经确认了dismissalDelegate是越来越设置到FormulasTableViewController所以我不明白为什么它不能看到dismissalDelegate?.selectionDidFinish(self)) 。 我的UIViewController的相关代码是: class […]

正确访问Segue的目标视图控制器来分配协议代理

在实现select列表时,我遇到了在集成segue和协议时遇到的一些问题。 在我的select列表中.h我有: #import <UIKit/UIKit.h> @protocol SelectionListViewControllerDelegate <NSObject> @required – (void)rowChosen:(NSInteger)row; @end @interface SelectColor : UITableViewController <NSFetchedResultsControllerDelegate> -(IBAction)saveSelectedColor; @property (nonatomic, strong) id <SelectionListViewControllerDelegate> delegate; @end 在我的select列表.m我有: @implementation SelectColori @synthesize delegate; //this method is called from a button on ui -(IBAction)saveSelectedColore { [self.delegate rowChosen:[lastIndexPath row]]; [self.navigationController popViewControllerAnimated:YES]; } 我想通过从另一个表视图执行segue来访问这个select列表视图: @implementation TableList … – (void)selectNewColor { SelectColor *selectController […]

如何使私人/自定义URL协议的jQuery GET / AJAX请求?

在Mac和iOS平台上, 可以通过自定义URIscheme/ NSURLProtocol与本机运行时进行双向交换 。 例如..要从一个本地的Objective-C方法请求一个NSImage ,你可以注册你的自定义处理程序(一个简单的string,在这里我用“ mycustomprotocol ”)与Webkit /你的WebView NSView ,并从JS调用它… var theURL = 'mycustomprotocol:///' + (textField.value); img.innerHTML = '<img src="'+theURL+'" id="string"/>'; 我会喜欢能够使用jQuery做请求,因为在这一点上,它比90年代风格的JS更为熟悉..但是据我所知,在网上, $.get和$.ajax只做http(s) 。 会喜欢的东西 javascript:document.location = 'mycustomprotocol://' 重写jQuery的URL处理? 当我谈到JavaScript的时候,我觉得这是一个愚蠢的行为,我相信这很容易做到。我相信这是整个jQuery移动框架是如何实现的(通过私有URI的)。所以,为什么没有什么在谷歌或所以呢,对吧? 我可以从我的姐姐朋友那里得到一些帮助吗?

无法在具有@objc属性的协议中使用自定义类?

我正在尝试为JSON加载委派JSONLoaderDelegate创build一个协议。 我的另一个名为JSONLoader类应该派发事件给它的委托(实现JSONLoaderDelegate协议),如下所示: self?.delegate?.jsonLoaderdidEndWithError(self!, error: JSONLoaderError.LoadError) JSONLoader的实现并不重要(imho)。 但是,我似乎有执行协议的问题,这是代码: @objc protocol JSONLoaderDelegate { optional func jsonLoaderdidBeginLoading(jsonLoader: JSONLoader) func jsonLoaderdidEndWithError(jsonLoader: JSONLoader, error: JSONLoader.JSONLoaderError) func jsonLoaderDidEndWithSuccess(jsonLoader: JSONLoader) } 这看起来很简单,但我得到一个错误: 方法不能标记@objc,因为参数的types不能在Objective-C中表示。 指出了所有三个function。 显然,如果我删除@objc属性,我不能使用该function的optional 。 我真的想保持jsonLoaderdidBeginLoading作为可选的寿。 任何想法/方法来解决这个问题? 谢谢!

如何声明一个同样符合协议的特定类的属性?

假设我想创build一个属性,它是UIViewController的一个子类,也符合协议MyDelegateProtocol。 在Objective-C中,我会写如下的东西: @property (strong, nonatomic) UIViewController<MyDelegateProtocol> *delegate; 不过,我不知道如何在Swift中写这个。 我知道如何声明一个符合协议的属性,或者是一个特定types的属性: let delegate : MyDelegateProtocol? let delegate : UIViewController? 但是我不能完全弄清楚如何做到这一点。 如果我尝试像这样: let delegate : UIViewController<MyDelegateProtocol> ? 然后我得到一个关于Cannot specialize non-generic type 'UIViewController'的编译器错误。 可能是因为我现在正在stream浪到仿制药领域。 我试过通过协议和其他堆栈溢出有关协议的Swift书,但我还没有find相当我在找什么。

Objective-C协议和类别可以被inheritance吗?

我对Objective-C协议和类别的一些概念有些困惑。 Objective-C中的子类可以inheritance协议和类别吗?