[译]从 Objective-C 学习 Swift:协议和委托|青训营笔记

39 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的的第十三天。青训营课程进度已经过半,我们已经对OC语言有了简单了解。此篇文章可以帮助我们更好的从OC语言转化到Swift语言。

本篇文章将会翻译codewithchris网站中的《从Objective-C 学习 Swift:协议和委托》文章。原文地址:codewithchris.com/learn-swift…

协议

在 iOS 开发中,协议是一组封装了一个功能单元的方法和属性。该协议实际上并不包含这些东西的任何实现;它只定义了所需的元素。任何声明自己符合此协议的类都必须实现协议中规定的方法和属性。

声明协议

Objective-C

在 Objective-C 中,协议是用“@protocol”关键字声明的。下面是一个声明包含一个必需方法的协议的示例。

@protocol SampleProtocol 

- (void)someMethod;

@end

Swift

在 Swift 中,语法有点不同,但想法是一样的。

protocol SampleProtocol 
{
    func someMethod()
}

符合协议

Objective-C

在 Objective-C 中,需要在类接口声明旁边的尖括号中添加协议名称。

MyClass 声明它符合下面的 SampleProtocol。MyClass 还必须在实现文件中为“someMethod”提供一个实现,因为它是必需的协议方法。

@interface MyClass : NSObject <SampleProtocol> 

@end

Swift

在 Swift 中,协议名称附加在超类名称旁边,用逗号分隔。如果没有superclass,那么你只需写一个冒号,后跟协议名称。

MyClass 和AnotherClass 都符合SampleProtocol。

class MyClass: SampleProtocol 
{
    // Conforming to SampleProtocol
    func someMethod() {
    }
}

class AnotherClass: SomeSuperClass, SampleProtocol
{
    // A subclass conforming to SampleProtocol
    func someMethod() {
    }
}

委托

委托与协议密切相关,因为它允许类指定符合某些协议的委托属性。然后可以将实际上符合该协议的第二个类分配给该属性。现在第一个类可以使用协议定义的方法和属性通过委托属性与第二个类进行通信。

声明委托属性

Objective-C

在 Objective-C 中,使用“id”关键字声明一个委托属性,如下所示。

@interface FirstClass : NSObject

@property (nonatomic, weak) id delegate;

@end

Swift

在 Swift 中,声明委托属性就像声明任何其他属性一样,并且您将协议名称指定为属性的类型。

您可能会注意到问号语法,它表明它是一个具有可选值的属性(可能有也可能没有分配给它的对象)。

class FirstClass
{
    var delegate:SampleProtocol?
}

调用委托方法

Objective-C

在 Objective-C 中,您经常会看到一个 If 语句,用于在调用委托方法之前检查是否有对象分配给委托属性。

if (self.delegate) 
    [self.delegate someMethod];

Swift

在 Swift 中,您可以利用问号语法。如果委托属性为空,则问号后面的任何内容都不会被执行。

delegate?.someMethod()

总结

协议和委托在 Objective-C 中被广泛使用,并且它们继续在 Swift 中使用。