Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 理解委托和协议之间的关系_Ios_Objective C_Swift_Delegates_Protocols - Fatal编程技术网

Ios 理解委托和协议之间的关系

Ios 理解委托和协议之间的关系,ios,objective-c,swift,delegates,protocols,Ios,Objective C,Swift,Delegates,Protocols,我知道这里有很多类似的问题,但我仍然需要澄清这个概念 首先,让我首先说,我确实理解什么是协议以及如何使用它们,我在理解方面遇到的问题是委托。我知道委托是指程序中的一个对象代表另一个对象,听起来很简单,但很难看到整个画面 1-委派只是让编译器知道在哪里查找将操作对象的代码(UITableView等)的一种方式吗 2-授权和协议是否协同工作 3-委托是否可以在没有协议的情况下存在?如果是,你能给我举个例子吗 4-当我们声明一个协议并且一个类符合它时,我们能说这个符合协议的类是在委托协议的行为吗 以上

我知道这里有很多类似的问题,但我仍然需要澄清这个概念

首先,让我首先说,我确实理解什么是协议以及如何使用它们,我在理解方面遇到的问题是委托。我知道委托是指程序中的一个对象代表另一个对象,听起来很简单,但很难看到整个画面

1-委派只是让编译器知道在哪里查找将操作对象的代码(UITableView等)的一种方式吗

2-授权和协议是否协同工作

3-委托是否可以在没有协议的情况下存在?如果是,你能给我举个例子吗

4-当我们声明一个协议并且一个类符合它时,我们能说这个符合协议的类是在委托协议的行为吗

以上有多少是正确的

非常感谢

1-委派只是让编译器知道在哪里查找将操作对象的代码(UITableView等)的一种方式吗

不,委派是一种设计模式。这只是一个概念

2-授权和协议是否协同工作

是的,他们合作得很好,这可能是为您的代表使用协议的最佳实践

3-委托是否可以在没有协议的情况下存在?如果是,你能给我举个例子吗

是的,你可以。委托的概念就是去除对象的智能,并将其放入委托中。例如,
UITableView
不知道它有多少行,也不知道单击单元格时要做什么,所以它会向其委托请求。 但委托仍然是另一个对象

如果它实现一个特定的协议会更好,但是你可以不用它

例如:

我有一个MyView,它是
MyCustomViewController
的子视图

MyCustomViewController.h

- (void)myViewIsTouched;
@property (nonatomic, weak) MyCustomViewController *delegate
MyView.h

- (void)myViewIsTouched;
@property (nonatomic, weak) MyCustomViewController *delegate
MyView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate myViewIsTouched];
}
本例中没有协议,但它仍然是一个委托。 (更好的方法仍然是使用协议,而不是在
.h
中声明方法)

4-当我们声明一个协议并且一个类符合它时,我们能说这个符合协议的类是在委托协议的行为吗

我不确定你在说什么。但是协议和委托不是一回事。实现协议的对象并不意味着它是委托

1-委派只是让编译器知道在哪里查找将操作对象的代码(UITableView等)的一种方式吗

不,委派是一种设计模式。这只是一个概念

2-授权和协议是否协同工作

是的,他们合作得很好,这可能是为您的代表使用协议的最佳实践

3-委托是否可以在没有协议的情况下存在?如果是,你能给我举个例子吗

是的,你可以。委托的概念就是去除对象的智能,并将其放入委托中。例如,
UITableView
不知道它有多少行,也不知道单击单元格时要做什么,所以它会向其委托请求。 但委托仍然是另一个对象

如果它实现一个特定的协议会更好,但是你可以不用它

例如:

我有一个MyView,它是
MyCustomViewController
的子视图

MyCustomViewController.h

- (void)myViewIsTouched;
@property (nonatomic, weak) MyCustomViewController *delegate
MyView.h

- (void)myViewIsTouched;
@property (nonatomic, weak) MyCustomViewController *delegate
MyView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate myViewIsTouched];
}
本例中没有协议,但它仍然是一个委托。 (更好的方法仍然是使用协议,而不是在
.h
中声明方法)

4-当我们声明一个协议并且一个类符合它时,我们能说这个符合协议的类是在委托协议的行为吗

我不确定你在说什么。但是协议和委托不是一回事。实现协议的对象并不意味着它是委托

  • 委托允许对象根据应用程序其他部分的更改来更改其外观/状态。设定 对象上的委托属性将允许编译器执行某些操作 在构建时进行检查

  • 委派通常通过使用协议来实现,因为它允许 委托对象必须是任何类而不是类的子类 具有特定的行为

  • 是的,但这会导致类紧密耦合,因为
    Foo
    需要了解
    Bar
    ,反之亦然。使用协议允许您使用任何类,因此
    id
    属性,从而形成松散耦合的系统

  • 例如:

    @class Foo;
    @interface Bar : NSObject
    - (void)respondToSomeAction:(Foo *)obj;
    @end
    
    @implementation Bar 
    - (void)respondToSomeAction:(Foo *)obj {
       NSLog("responding to %@",obj);
    }
    @end
    
    @interface Foo : NSObject 
    @property (nonatomic, weak) Bar *delegate
    @end
    
    @implementation Foo
    - (void)someActionTriggered {
        [self.delegate respondToSomeAction:self]
    }
    @end
    
  • 当一个类符合协议时,该类被迫采用协议的行为(实现方法)。只有当它被指定代表另一个类执行某些任务(例如提供表中的行数)时,它才会成为委托
  • 委托允许对象根据应用程序其他部分的更改来更改其外观/状态。设定 对象上的委托属性将允许编译器执行某些操作 在构建时进行检查

  • 委派通常通过使用协议来实现,因为它允许 委托对象必须是任何类而不是类的子类 具有特定的行为

  • 是的,但这会导致类紧密耦合,因为
    Foo
    需要了解
    Bar
    ,反之亦然。使用协议允许您使用任何类,因此
    id
    属性,从而形成松散耦合的系统

  • 例如:

    @class Foo;
    @interface Bar : NSObject
    - (void)respondToSomeAction:(Foo *)obj;
    @end
    
    @implementation Bar 
    - (void)respondToSomeAction:(Foo *)obj {
       NSLog("responding to %@",obj);
    }
    @end
    
    @interface Foo : NSObject 
    @property (nonatomic, weak) Bar *delegate
    @end
    
    @implementation Foo
    - (void)someActionTriggered {
        [self.delegate respondToSomeAction:self]
    }
    @end
    
  • 当一个类符合协议时,该类被迫采用协议的行为(实现方法)。只有当它被赋予一些代表ano的任务时,它才会成为委托