swift是这些协议之间的区别

时间:2015-08-20 18:47:56

标签: ios xcode swift

我看到协议已经以两种方式宣布,但我没有找到差异。

练习1:

With sales as (
    SELECT 
           DimProduct.ProductKey,
           DimProduct.ProductName,
           VW_ParallelSales.Saledate,
           VW_ParallelSales.ParallelDate,
           VW_ParallelSales.CurrentSales,
           VW_ParallelSales.ParallelSales
    FROM   DimProduct INNER JOIN VW_ParallelSales ON DimProduct.ProductKey = 
           VW_ParallelSales.ProductKey
)
SELECT 
   s_recent.ProductName,
   s_recent.Saledate ThisYear,
   s_old.Saledate PreviousYear,
   s_recent.CurrentSales CurrentSales,
   s_old.CurrentSales ParallelSales
FROM 
    SALES s_recent 
    left outer join SALES s_old 
        on s_recent.saledate = s_old.saledate + 10000
       and s_recent.ProductKey = s_old.ProductKey

练习2:

protocol AddItemViewControllerDelegate {
    func controller(controller: AddItemViewController, didAddItem: String)
}

那么差异是什么?

2 个答案:

答案 0 :(得分:4)

来自文档:

  

您可以将协议采用限制为类类型(而不是结构或类型)   枚举)通过将class关键字添加到协议的继承中   名单。 class关键字必须始终首先出现在协议中   继承列表,在任何继承的协议之前:

protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
// class-only protocol definition goes here }

注意:

  

在该协议定义的行为时使用仅类协议   要求假定或要求符合类型具有参考   语义而不是价值语义。

答案 1 :(得分:1)

如果你想声明一个这样的变量:

protocol AddItemViewControllerDelegate: class {
    func controller(controller: AddItemViewController, didAddItem: String)
}

你必须这样做:

$view = Zend_Controller_Front::getInstance()
    ->getParam('bootstrap')
    ->getResource('view');
$view->recordUID = XXXXXX