Tag: Swift协议

带有`default`参数值的Swift协议

在一个非常常见的情况下,您有一个类 ,其中包含带有默认参数值的方法,并且您要对其进行测试。 Baz类{ func foo(bar:BarType,camp:CampType = CampType())->字符串{ 返回“世界” } } 首先编写协议,以便可以为类实现模拟,如下所示: 协议BazProtocol { func foo(bar:BarType,camp:CampType)->字符串 } 和模拟 : struct BazMock:BazProtocol { func foo(bar:BarType,camp:CampType)->字符串{ 返回“” } } 您希望模拟共享默认值,因此首先要在协议定义中设置默认值,最后得到类似这样的内容。 协议BazProtocol { func foo(bar:BarType,camp:CampType =“ Hello”)->字符串 } 但是您得到以下错误: default argument not permitted in a protocol method 有一种方法可以解决该限制。 扩展程序可以解救! 我们不会在Baz或BazMock上定义默认参数,但将使用协议扩展名 ,这是将定义默认值的唯一位置。 这样,同一协议的两个实现都具有相同的默认值。 扩展名BazProtocol { func foo( bar:BarType, camp:CampType = […]

协议和扩展…

关键字“协议”用于快速声明协议。 所有类,枚举和结构都可以采用该协议。 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 协议在面向协议的编程中被大量使用。 您在协议中声明的所有属性都必须是 { get}或{get set}。 get类型提供了更大的灵活性,我们稍后可以在诸如“ let”或“ var”类型的对象中定义它们。 像OOP一样,我们可以继承/确认另一个协议。 但是在OOP中,我们只能从一个类继承。 也就是说,我们可以有很多子类,但一个类一次只能包含一个父类。 如果您继承一个类,则有时会从父类获取所有API,而有时我们并不需要全部。 在POP(面向协议的编程)中,我们可以一次确认具有多种协议的对象。 这样,我们可以根据需要制定任意数量的协议,然后无论需要什么协议,这些都可以由我们的对象确认。 这提供了很大的灵活性。 合理? 别担心! 我很快会对此做出更多解释! 在以下示例中,我们在集合中使用了两种对象,即类和结构,并将其传递给tableview数据源。 我们可以在函数名称之前使用Mutating关键字,以更改确认对象中的属性(值)。 如果您注意到,在类对象中,我们不需要使用“变异”,因为类对象方法具有预定义的功能来更改其变量。 但是像struct这样的对象是基于值的,因此要更改其属性,我们需要在试图更改其自身对象中的值的函数之前保留“ mutating”关键字。 我们可以在协议中使用初始化程序,以一种简单的方式初始化已确认的对象。 在以下示例中,我们创建了一个对Currency都确认的所有加密货币的集合。 但是集合元素无法访问“货币”协议之外的外部功能或属性。 例如,无法从View Controller中的“ currencies”数组访问CryptoCoin类的“ creatorName ”属性。 我们对现有类型使用“ extension ”关键字,以在POP中添加诸如函数定义和计算属性之类的功能,如果我们在继承对象中需要相同的函数定义(不是全部,而是大多数),该怎么办。 然后我们可以扩展协议,然后在该扩展中定义功能。 然后,无论什么对象需要该功能,都可以确认该协议的那些对象。 如果您愿意,可以在某些子对象中覆盖该func定义。 例子: 我们可以使用扩展将协议一致性添加到现有类型中,您可以在项目中的某些位置定义协议一致性。 我们可以扩展来自(导入的)框架或库的类型。 如果在以上示例中看到,则方形按钮通过确认单个协议来确认两个协议,而该协议本身又被其他两个协议确认。 因此,只有方形按钮才能实现更改背景和文本的两种方法。 其余请根据需要确认协议。 您可以尝试更多以了解更多信息……