精华内容
下载资源
问答
  • 关联类型

    千次阅读 2016-12-07 23:11:29
    定义一个协议时,的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 ...

    关联类型

    定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 associatedtype 关键字来指定关联类型。

    关联类型实践

    下面例子定义了一个 Container 协议,该协议定义了一个关联类型 ItemType

    protocol Container {
        associatedtype ItemType
        mutating func append(item: ItemType)
        var count: Int { get }
        subscript(i: Int) -> ItemType { get }
    }

    Container 协议定义了三个任何采纳了该协议的类型(即容器)必须提供的功能:

    • 必须可以通过 append(_:) 方法添加一个新元素到容器里。
    • 必须可以通过 count 属性获取容器中元素的数量,并返回一个 Int 值。
    • 必须可以通过索引值类型为 Int 的下标检索到容器中的每一个元素。

    这个协议没有指定容器中元素该如何存储,以及元素必须是何种类型。这个协议只指定了三个任何遵从 Container 协议的类型必须提供的功能。遵从协议的类型在满足这三个条件的情况下也可以提供其他额外的功能。

    任何遵从 Container 协议的类型必须能够指定其存储的元素的类型,必须保证只有正确类型的元素可以加进容器中,必须明确通过其下标返回的元素的类型。

    为了定义这三个条件,Container 协议需要在不知道容器中元素的具体类型的情况下引用这种类型。Container 协议需要指定任何通过 append(_:) 方法添加到容器中的元素和容器中的元素是相同类型,并且通过容器下标返回的元素的类型也是这种类型。

    为了达到这个目的,Container 协议声明了一个关联类型 ItemType,写作 associatedtype ItemType。这个协议无法定义 ItemType 是什么类型的别名,这个信息将留给遵从协议的类型来提供。尽管如此,ItemType 别名提供了一种方式来引用 Container 中元素的类型,并将之用于 append(_:) 方法和下标,从而保证任何 Container 的行为都能够正如预期地被执行。

    下面是先前的非泛型的 IntStack 类型,这一版本采纳并符合了 Container 协议:

    struct IntStack: Container {
        // IntStack 的原始实现部分
        var items = [Int]()
        mutating func push(item: Int) {
            items.append(item)
        }
        mutating func pop() -> Int {
            return items.removeLast()
        }
        // Container 协议的实现部分
        typealias ItemType = Int
        mutating func append(item: Int) {
            self.push(item)
        }
        var count: Int {
            return items.count
        }
        subscript(i: Int) -> Int {
            return items[i]
        }
    }

    IntStack 结构体实现了 Container 协议的三个要求,其原有功能也不会和这些要求相冲突。

    此外,IntStack 在实现 Container 的要求时,指定 ItemType 为 Int 类型,即 typealias ItemType = Int,从而将 Container 协议中抽象的 ItemType 类型转换为具体的 Int 类型。

    由于 Swift 的类型推断,你实际上不用在 IntStack 的定义中声明 ItemType 为 Int。因为 IntStack 符合 Container 协议的所有要求,Swift 只需通过 append(_:) 方法的 item 参数类型和下标返回值的类型,就可以推断出 ItemType 的具体类型。事实上,如果你在上面的代码中删除了 typealias ItemType = Int 这一行,一切仍旧可以正常工作,因为 Swift 清楚地知道 ItemType 应该是哪种类型。

    你也可以让泛型 Stack 结构体遵从 Container 协议:

    struct Stack<Element>: Container {
        // Stack<Element> 的原始实现部分
        var items = [Element]()
        mutating func push(item: Element) {
            items.append(item)
        }
        mutating func pop() -> Element {
            return items.removeLast()
        }
        // Container 协议的实现部分
        mutating func append(item: Element) {
            self.push(item)
        }
        var count: Int {
            return items.count
        }
        subscript(i: Int) -> Element {
            return items[i]
        }
    }

    这一次,占位类型参数 Element 被用作 append(_:) 方法的 item 参数和下标的返回类型。Swift 可以据此推断出 Element 的类型即是 ItemType 的类型。

    通过扩展一个存在的类型来指定关联类型

    通过扩展添加协议一致性中描述了如何利用扩展让一个已存在的类型符合一个协议,这包括使用了关联类型的协议。

    Swift 的 Array 类型已经提供 append(_:) 方法,一个 count 属性,以及一个接受 Int 类型索引值的下标用以检索其元素。这三个功能都符合 Container 协议的要求,也就意味着你只需简单地声明 Array 采纳该协议就可以扩展 Array,使其遵从 Container 协议。你可以通过一个空扩展来实现这点,正如通过扩展采纳协议中的描述:

    extension Array: Container {}

    如同上面的泛型 Stack 结构体一样,Array 的 append(_:) 方法和下标确保了 Swift 可以推断出 ItemType 的类型。定义了这个扩展后,你可以将任意 Array 当作 Container 来使用。

    展开全文
  • 夫妻关系,一对一 人和身份证号,一对一 用户和手机号 一对多 爸爸和儿子 一对多 班级和学生 一对多 学校和学生 一对多 部门和员工 一对多 订单和网单 一对多 ...

    夫妻关系,一对一

    人和身份证号,一对一

     

    用户和手机号   一对多

    爸爸和儿子  一对多

    班级和学生  一对多

    学校和学生  一对多

    部门和员工  一对多

    订单和网单  一对多

     

     

     

     

    展开全文
  • associatedtype关联类型

    千次阅读 2017-11-07 14:43:58
    定义一个协议时,的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 ...

    associatedtype关联类型


    定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 associatedtype 关键字来指定关联类型。比如使用协议声明更新cell的方法:

    //模型
    struct Model {
        let age: Int
    }
    
    //协议,使用关联类型
    protocol TableViewCell {
        associatedtype T
        func updateCell(_ data: T)
    }
    
    //遵守TableViewCell
    class MyTableViewCell: UITableViewCell, TableViewCell {
        typealias T = Model
        func updateCell(_ data: Model) {
            // do something ...
        }
    }


    展开全文
  • void RegeditFileToSystem(CString strApplication, CString sFileType,CString sIconFile, CString strDescription ...)*/) //sFileType关联的.file文件 {  CString strRunKey;  strRunKey.Format("%s_auto_...

    void RegeditFileToSystem(CString strApplication, CString sFileType,CString sIconFile, CString strDescription /*= _T("")*/) //sFileType关联的.file文件
    {
        CString strRunKey;
        strRunKey.Format("%s_auto_open",sFileType.Right(sFileType.GetLength()-1));
        HKEY hKey;
        if (ERROR_SUCCESS == ::RegOpenKey(HKEY_CLASSES_ROOT,_T(""), &hKey))
        {
            HKEY hTempKey;
            if (ERROR_SUCCESS == ::RegCreateKey(hKey,sFileType,&hTempKey))
            {            
                if (ERROR_SUCCESS != ::RegSetValue(hTempKey,_T(""),REG_SZ,strRunKey,sizeof(DWORD)))
                {
                   AfxMessageBox(_T("操作注册表错误"));
                    ::RegCloseKey(hKey);
                    return;
                }
            }
        }
        ::RegCloseKey(hKey);

        HKEY hRunKey;
        if (RegOpenKey( HKEY_CLASSES_ROOT, strRunKey, &hRunKey ) != ERROR_SUCCESS )
        {
            if (RegCreateKey( HKEY_CLASSES_ROOT, strRunKey, &hRunKey ) != ERROR_SUCCESS )
            {
                ASSERT(FALSE);
                RegCloseKey( hRunKey );
                return;
            }
        }
        if (strDescription.IsEmpty() == false)
            RegSetValue( hRunKey, _T(""), REG_SZ, strDescription, strDescription.GetLength()+1 ) ;

        if (sIconFile.IsEmpty())
        {
            ::RegDeleteKey(hRunKey,_T("DefaultIcon"));
        }
        else
        {
            HKEY hIconKey;
            if (ERROR_SUCCESS == ::RegCreateKey(hRunKey,_T("DefaultIcon"),&hIconKey))
            {
                CString sIconValue;
                if (sIconFile.IsEmpty())
                    sIconValue.Format( _T("\"%s\",3"), strApplication );
                else
                    sIconValue = sIconFile;
                RegSetValue( hIconKey, _T(""), REG_SZ, sIconValue, sIconValue.GetLength()+1 ) ;
            }
        }    


        HKEY hShellKey;
        if (ERROR_SUCCESS == ::RegCreateKey(hRunKey,_T("shell"),&hShellKey))
        {
            HKEY hOpenKey;
            if (ERROR_SUCCESS == ::RegCreateKey(hShellKey,_T("open"),&hOpenKey))
            {
                HKEY hCommandKey;
                if (ERROR_SUCCESS == ::RegCreateKey(hOpenKey,_T("command"),&hCommandKey))
                {
                    CString strExePath;
                    strExePath.Format( _T("\"%s\" \"%%1\""), strApplication ) ;
                    if (ERROR_SUCCESS != ::RegSetValue(hCommandKey,_T(""),REG_SZ,strExePath,sizeof(DWORD)))
                    {
                        AfxMessageBox(_T("操作注册表错误"));
                        ASSERT(FALSE);
                    }
                }
            }
        }

        RegCloseKey( hRunKey );
    }

     

    软件关联2种格式文件 *.cusa *.cusb, 2种格式文件都用exe打开,2种文件关联图标显示分别设置2个文件图标

    请在资源下载测试样例

    展开全文
  • 目前市面上的防关联浏览器或者工具很多,如 候鸟浏览器,跨境卫士,林肯法球浏览器,紫鸟超级浏览器,vmlogin浏览器,multilogin浏览器,快兔超级浏览爱跨境浏览器等等。 作为一个付费用户,尤其是像我这种花了几万...
  • 分析企业法人还有哪些关联公司,关联公司注册了哪些域名,这些域名是在哪个云平台注册的。 【思路】 1、对比测试,在不登陆的情况下,“企查查”比“天眼查”能查看到更多的信息。查询企业法人的关联公司,选择用...
  • 从使用的广义角度上看,数据挖掘常用分析方法主要分类、聚类、估值、预测、关联规则、可视化等。从数据挖掘算法所依托的数理基础角度归类,目前数据挖掘算法主要分为三大类:机器学习方法、统计方法与神经网络方法...
  • UML中关联类型

    2019-10-06 13:26:10
    UML中关联类型 普通关联(Assocation),分单向和双向。 聚合(Aggregation),用的比较多。 组合(Compostion) 普通关联中,单向箭头,双向无箭头。 ...
  • 软件关联2种格式文件 *.cusa *.cusb, 2种格式文件都用exe打开,2种文件关联图标显示分别设置2个文件图标
  • 关联类型(associated types)是一个将类型占位符与 trait 相关联的方式,这样 trait 的方法签名中就可以使用这些占位符类型。trait 的实现者会针对特定的实现在这个类型的位置指定相应的具体类型。如此可以定义一个...
  • 今天做项目时发现了一个问题,业务表与字典表关联,发现查询出...从中发现,数据问题,并不是我想要的结果,再仔细查看了下sql,发现语句也没问题,一直百思不得其解,突然想到是不是两者的字段类型不同,查了下两者
  • 主要介绍了C#中枚举类型和radiobox关联操作的方法,实例分析了C#中枚举类型及与控件关联操作的相关技巧,需要的朋友可以参考下
  • WebStorm文件类型关联设置

    千次阅读 2018-04-28 09:49:45
    无意中创造了一个没有扩展名的文件,我选择了错误的文件类型关联。是js类型的,我却选成了文本,Ws每次编辑类型就成了txt文本,这个问题让我很苦恼,以下是我的解决方案。 错选的弹出框如下:   解决方案如下: ...
  • 分分钟搞懂各种类型数据库的关联 分分钟搞懂各种类型数据库的关联
  • 信号和槽的关联类型

    千次阅读 2017-09-19 09:16:12
    函数原型: [static] QMetaObject::Connection QObject::Connection(const QObject* sender, ...这时两个对象间的相同的信号和槽只能唯一的关联。使用这个标志主要为了防止重复关联
  • webstorm关联文件类型之后 就会使用默认关联类型打开 一旦关联错误 很难修改 打开webstorm设置-->选择File Types -->显示所有的关联类型 点击已经选择的关联类型(如果不知道关联到哪里 就挨个点击 查看下面的...
  • goland 修改文件的关联类型

    千次阅读 2017-12-27 10:44:00
    查看相应的类型, 编辑所需的文件。 1、手动修改 如 linux shell 脚本的, 需要选中 Bourne Again Shell (安装Bash Support插件),  下面列表框会 registered paterns : *.bash (后缀默认自动关联) ...
  • 关联词的八种类型.doc

    2021-09-26 21:19:25
    关联词的八种类型.doc
  • 详细介绍了数据关联类型、数据关联门的类型关联门的选择原则、关联门的确定,并分析了数据关联的过程、门限的确定原则、关联门的使用等问题。
  • oracle两表关联查询不出数据时,可能是关联的ID数据类型不一样。 例如: table1 id varchar2(10), name varchar2(20); table2 id char(5), source number(4,2); select * from table1 a left join table2 b on ...
  • 现代汉语关联词语的种类及使用.doc
  • 简单轻松地将文件类型关联到应用程序
  • VSCode注册关联自定义类型文件

    千次阅读 2019-09-05 20:31:44
    打开你要注册的文件类型文件【本文中用 “.txt”到“.lua”演示】 在VSCode窗口右下角当前文件类型“Plain Text” 是可以被点击的。... :将当前文件类型关联到 3、Configure ‘Plain Text’...
  • 两表关联时,因关联字段类型不一致导致的问题。 问题1. 索引失效。 问题2. 查询错误。 关联查询时int 类型的1与varchar类型的‘001’ 可匹配。 解决问题:利用cast(字段 as 字段类型)函数,或者convert(字段...
  • 对于 Windows 桌面应用来说,让应用关联一种或多种文件类型是通过修改注册表来实现的。 本文介绍如何为你的应用关联自定义的文件类型或者关联被广泛使用的文件类型。 本文内容文件关联注册一个文件类型取一个应用...
  • 这里我需要将pdf能从其他地方响应并加载,如微信的pdf文件用我的...1.定义pdf文件:这里就响应了的类型是所有类型 <activity android:name=".contact.activity.MyPdfOpenActivity"> <intent-filter> &...
  • Qt 如何实现文件类型关联

    千次阅读 2016-09-11 15:54:40
    何为文件打开关联,比如,一个扩展名为txt的文本,双击之后会调用 notepad.exe 进行打开,doc的扩展名会调用word打开等等。 咱们今天讲的是如何在Qt所编写的程序实现这个动作。 这个关联动作都是记录在注册表中的...
  • 这个文件详细介绍了文件关联的过程,并提供了代码。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,004,204
精华内容 401,681
关键字:

关联的种类有哪些