代码之家  ›  专栏  ›  技术社区  ›  Runsva

在Swift中传递泛型类型作为函数参数?

  •  -1
  • Runsva  · 技术社区  · 2 年前

    我正试图将一个泛型参数对象类型传递给Swift中的类函数。我使用的是Swift v5.9。

    以下是一个最小的示例代码摘录:

    import Foundation
    
    class Test_Class
    {
        var Test_Field = 0
        
        init(value)
        {
            self.Test_Field = value
        }
    }
    

    在尝试编译时会提示出现几个错误,包括:

    unnamed parameters must be written with the empty name '_'
    init(value)
    
    cannot find type 'value' in scope
    init(value)
    
    cannot find 'value' in scope
    self.Test_Field = value
    

    中的答案之一 this post 建议使用关键字 T 对于每个泛型参数类型,但尝试添加 T 对于这样的参数类型:

    import Foundation
    
    class Test_Class
    {
        var Test_Field = 0
        
        init(value: T)
        {
            self.Test_Field = value
        }
    }
    

    结果如下:

    cannot find type 'T' in scope
    init(value: T)
    

    他们还建议在 T 关键字,如 T.type ,但是在这种情况下,我不想为 Test_Field 。我想保留它作为一个通用。

    在Swift中,将泛型参数对象类型传递给函数的正确方法是什么?

    感谢阅读我的帖子,任何指导都将不胜感激。

    1 回复  |  直到 2 年前
        1
  •  1
  •   HangarRash    2 年前

    这个 Generics 斯威夫特书中的章节将对你的问题非常有帮助。

    通过阅读,你会发现你的问题可能的答案如下:

    class TestClass<T> {
        var testField: T
    
        init(value: T) {
            self.testField = value
        }
    }
    
    let someTest = TestClass(value: "Hello") // with a String
    print(someTest.testField)
    let otherTest = TestClass(value: 42) // with an Int
    print(otherTest.testField)
    

    从类下面的示例中可以看到,您可以创建 TestClass 具有任何类型的值。

    但请注意,一旦为给定类型的值创建了实例,就不能为该实例分配不同类型的值。

    例如,一旦您这样做:

    let someTest = TestClass(value: "Hello") // with a String
    

    您可以:

    someTest.testField = "Goodbye" // this is OK
    

    但你不能:

    someTest.testField = 42 // this won't compile
    

    最后一行不起作用,因为 someTest 为创建了实例 String 所以 testField 的类型为 一串 。所以您不能为其指定类型的值 Int