Error[8]: Undefined offset: 10, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在C#中,可以通过指定类型来调用通用方法: public T f<T>(){ return something as T}var x = f<string>() 调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的: func f<T>() -> T? { return something as T?}let x = f<String>( 在C#中,可以通过指定类型来调用通用方法:
public T f<T>(){   return something as T}var x = f<string>()

调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的:

func f<T>() -> T? {    return something as T?}let x = f<String>() // not allowed in Swift

我需要的是一种将类型传递给函数的方法,该函数使用泛型返回该类型的对象

这是有效的,但它并不适合我想做的事情:

let x = f() as String?

编辑(澄清)

我可能没有非常清楚这个问题实际上是什么,所有这一切都是关于一个更简单的语法来调用返回给定类型(任何类型)的函数.

作为一个简单的例子,假设你有一个Any的数组,你创建一个返回给定类型的第一个元素的函数:

// returns the first element in the array of that typefunc findFirst<T>(array: [Any]) -> T? {    return array.filter() { 
let array = [something,something,...]let x = findFirst(array) as String?
is T }.first as? T}

你可以这样调用这个功能:

(findFirst(array) as MyProtocol?)?.someMethodInMyProtocol()(findFirst(array) as OtherProtocol?)?.someMethodInOtherProtocol()

这很简单,但是如果返回的类型是一些方法的协议,并且您想要在返回的对象上调用方法呢?

findFirst<MyProtocol>(array).someMethodInMyProtocol();

那个语法很尴尬在C#(与Swift类似的类型)中,您可以这样做:

func findFirst<T>(in array: [Any],ofType _: T.Type) -> T? {    return array.lazy.flatMap{ 
protocol SomeProtocol {    func doSomething()}protocol AnotherProtocol {    func somethingElse()}extension String : SomeProtocol {    func doSomething() {        print("success:",self)    }}let a: [Any] = [5,"str",6.7]// outputs "success: str",as the second element is castable to SomeProtocol.findFirst(in: a,ofType: SomeProtocol.self)?.doSomething()// doesn't output anything,as none of the elements conform to AnotherProtocol.findFirst(in: a,ofType: AnotherProtocol.self)?.somethingElse()
as? T }.first}

可悲的是,这在Swift中是不可能的.

所以问题是:有没有办法用一个更干净(更尴尬)的语法来完成这个.

不幸的是,您不能显式定义通用函数的类型(通过使用< ...>语法).但是,您可以提供一个通用元类型(T.Type)作为函数的参数,以便允许Swift将该函数的通用类型推断为 Roman has said.

对于您的具体示例,您将希望您的功能如下所示:

extension Sequence {    func first<T>(ofType _: T.Type) -> T? {        return lazy.flatMap{ [+++] as? T }.first    }}let a: [Any] = [5,6.7]print(a.first(ofType: Double.self) as Any) // Optional(6.7000000000000002)

在这里,我们使用flatMap(_ :)来获取成功转换为T的元素序列,然后首先获得该序列的第一个元素.我们也使用懒惰,以便我们可以在找到第一个元素后停止评估元素.

使用示例

[+++]

请注意,您必须使用.self才能引用特定类型(在本例中为SomeProtocol)的元类型.也许不是一个光滑的语法,你的目标是,但我认为这是一样好,你会得到.

虽然在这种情况下值得注意的是,该功能将更好地放在Sequence的扩展中:

[+++] 总结

以上是内存溢出为你收集整理的在Swift中使用类型名称的通用功能全部内容,希望文章能够帮你解决在Swift中使用类型名称的通用功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 11, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在C#中,可以通过指定类型来调用通用方法: public T f<T>(){ return something as T}var x = f<string>() 调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的: func f<T>() -> T? { return something as T?}let x = f<String>( 在C#中,可以通过指定类型来调用通用方法:
public T f<T>(){   return something as T}var x = f<string>()

调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的:

func f<T>() -> T? {    return something as T?}let x = f<String>() // not allowed in Swift

我需要的是一种将类型传递给函数的方法,该函数使用泛型返回该类型的对象

这是有效的,但它并不适合我想做的事情:

let x = f() as String?

编辑(澄清)

我可能没有非常清楚这个问题实际上是什么,所有这一切都是关于一个更简单的语法来调用返回给定类型(任何类型)的函数.

作为一个简单的例子,假设你有一个Any的数组,你创建一个返回给定类型的第一个元素的函数:

// returns the first element in the array of that typefunc findFirst<T>(array: [Any]) -> T? {    return array.filter() { 
let array = [something,something,...]let x = findFirst(array) as String?
is T }.first as? T}

你可以这样调用这个功能:

(findFirst(array) as MyProtocol?)?.someMethodInMyProtocol()(findFirst(array) as OtherProtocol?)?.someMethodInOtherProtocol()

这很简单,但是如果返回的类型是一些方法的协议,并且您想要在返回的对象上调用方法呢?

findFirst<MyProtocol>(array).someMethodInMyProtocol();

那个语法很尴尬在C#(与Swift类似的类型)中,您可以这样做:

func findFirst<T>(in array: [Any],ofType _: T.Type) -> T? {    return array.lazy.flatMap{ 
protocol SomeProtocol {    func doSomething()}protocol AnotherProtocol {    func somethingElse()}extension String : SomeProtocol {    func doSomething() {        print("success:",self)    }}let a: [Any] = [5,"str",6.7]// outputs "success: str",as the second element is castable to SomeProtocol.findFirst(in: a,ofType: SomeProtocol.self)?.doSomething()// doesn't output anything,as none of the elements conform to AnotherProtocol.findFirst(in: a,ofType: AnotherProtocol.self)?.somethingElse()
as? T }.first}

可悲的是,这在Swift中是不可能的.

所以问题是:有没有办法用一个更干净(更尴尬)的语法来完成这个.

不幸的是,您不能显式定义通用函数的类型(通过使用< ...>语法).但是,您可以提供一个通用元类型(T.Type)作为函数的参数,以便允许Swift将该函数的通用类型推断为 Roman has said.

对于您的具体示例,您将希望您的功能如下所示:

extension Sequence {    func first<T>(ofType _: T.Type) -> T? {        return lazy.flatMap{  as? T }.first    }}let a: [Any] = [5,6.7]print(a.first(ofType: Double.self) as Any) // Optional(6.7000000000000002)

在这里,我们使用flatMap(_ :)来获取成功转换为T的元素序列,然后首先获得该序列的第一个元素.我们也使用懒惰,以便我们可以在找到第一个元素后停止评估元素.

使用示例

[+++]

请注意,您必须使用.self才能引用特定类型(在本例中为SomeProtocol)的元类型.也许不是一个光滑的语法,你的目标是,但我认为这是一样好,你会得到.

虽然在这种情况下值得注意的是,该功能将更好地放在Sequence的扩展中:

[+++] 总结

以上是内存溢出为你收集整理的在Swift中使用类型名称的通用功能全部内容,希望文章能够帮你解决在Swift中使用类型名称的通用功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 12, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

概述在C#中,可以通过指定类型来调用通用方法: public T f<T>(){ return something as T}var x = f<string>() 调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的: func f<T>() -> T? { return something as T?}let x = f<String>( 在C#中,可以通过指定类型来调用通用方法:
public T f<T>(){   return something as T}var x = f<string>()

调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的:

func f<T>() -> T? {    return something as T?}let x = f<String>() // not allowed in Swift

我需要的是一种将类型传递给函数的方法,该函数使用泛型返回该类型的对象

这是有效的,但它并不适合我想做的事情:

let x = f() as String?

编辑(澄清)

我可能没有非常清楚这个问题实际上是什么,所有这一切都是关于一个更简单的语法来调用返回给定类型(任何类型)的函数.

作为一个简单的例子,假设你有一个Any的数组,你创建一个返回给定类型的第一个元素的函数:

// returns the first element in the array of that typefunc findFirst<T>(array: [Any]) -> T? {    return array.filter() { 
let array = [something,something,...]let x = findFirst(array) as String?
is T }.first as? T}

你可以这样调用这个功能:

(findFirst(array) as MyProtocol?)?.someMethodInMyProtocol()(findFirst(array) as OtherProtocol?)?.someMethodInOtherProtocol()

这很简单,但是如果返回的类型是一些方法的协议,并且您想要在返回的对象上调用方法呢?

findFirst<MyProtocol>(array).someMethodInMyProtocol();

那个语法很尴尬在C#(与Swift类似的类型)中,您可以这样做:

func findFirst<T>(in array: [Any],ofType _: T.Type) -> T? {    return array.lazy.flatMap{ 
protocol SomeProtocol {    func doSomething()}protocol AnotherProtocol {    func somethingElse()}extension String : SomeProtocol {    func doSomething() {        print("success:",self)    }}let a: [Any] = [5,"str",6.7]// outputs "success: str",as the second element is castable to SomeProtocol.findFirst(in: a,ofType: SomeProtocol.self)?.doSomething()// doesn't output anything,as none of the elements conform to AnotherProtocol.findFirst(in: a,ofType: AnotherProtocol.self)?.somethingElse()
as? T }.first}

可悲的是,这在Swift中是不可能的.

所以问题是:有没有办法用一个更干净(更尴尬)的语法来完成这个.

不幸的是,您不能显式定义通用函数的类型(通过使用< ...>语法).但是,您可以提供一个通用元类型(T.Type)作为函数的参数,以便允许Swift将该函数的通用类型推断为 Roman has said.

对于您的具体示例,您将希望您的功能如下所示:

extension Sequence {    func first<T>(ofType _: T.Type) -> T? {        return lazy.flatMap{  as? T }.first    }}let a: [Any] = [5,6.7]print(a.first(ofType: Double.self) as Any) // Optional(6.7000000000000002)

在这里,我们使用flatMap(_ :)来获取成功转换为T的元素序列,然后首先获得该序列的第一个元素.我们也使用懒惰,以便我们可以在找到第一个元素后停止评估元素.

使用示例

请注意,您必须使用.self才能引用特定类型(在本例中为SomeProtocol)的元类型.也许不是一个光滑的语法,你的目标是,但我认为这是一样好,你会得到.

虽然在这种情况下值得注意的是,该功能将更好地放在Sequence的扩展中:

[+++] 总结

以上是内存溢出为你收集整理的在Swift中使用类型名称的通用功能全部内容,希望文章能够帮你解决在Swift中使用类型名称的通用功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
在Swift中使用类型名称的通用功能_app_内存溢出

在Swift中使用类型名称的通用功能

在Swift中使用类型名称的通用功能,第1张

概述在C#中,可以通过指定类型来调用通用方法: public T f<T>(){ return something as T}var x = f<string>() 调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的: func f<T>() -> T? { return something as T?}let x = f<String>( 在C#中,可以通过指定类型来调用通用方法:
public T f<T>(){   return something as T}var x = f<string>()

调用它时,Swift不允许你专门化通用的方法.编译器要依赖类型推断,所以这是不可能的:

func f<T>() -> T? {    return something as T?}let x = f<String>() // not allowed in Swift

我需要的是一种将类型传递给函数的方法,该函数使用泛型返回该类型的对象

这是有效的,但它并不适合我想做的事情:

let x = f() as String?

编辑(澄清)

我可能没有非常清楚这个问题实际上是什么,所有这一切都是关于一个更简单的语法来调用返回给定类型(任何类型)的函数.

作为一个简单的例子,假设你有一个Any的数组,你创建一个返回给定类型的第一个元素的函数:

// returns the first element in the array of that typefunc findFirst<T>(array: [Any]) -> T? {    return array.filter() { 
let array = [something,something,...]let x = findFirst(array) as String?
is T }.first as? T}

你可以这样调用这个功能:

(findFirst(array) as MyProtocol?)?.someMethodInMyProtocol()(findFirst(array) as OtherProtocol?)?.someMethodInOtherProtocol()

这很简单,但是如果返回的类型是一些方法的协议,并且您想要在返回的对象上调用方法呢?

findFirst<MyProtocol>(array).someMethodInMyProtocol();

那个语法很尴尬在C#(与Swift类似的类型)中,您可以这样做:

func findFirst<T>(in array: [Any],ofType _: T.Type) -> T? {    return array.lazy.flatMap{ 
protocol SomeProtocol {    func doSomething()}protocol AnotherProtocol {    func somethingElse()}extension String : SomeProtocol {    func doSomething() {        print("success:",self)    }}let a: [Any] = [5,"str",6.7]// outputs "success: str",as the second element is castable to SomeProtocol.findFirst(in: a,ofType: SomeProtocol.self)?.doSomething()// doesn't output anything,as none of the elements conform to AnotherProtocol.findFirst(in: a,ofType: AnotherProtocol.self)?.somethingElse()
as? T }.first}

可悲的是,这在Swift中是不可能的.

所以问题是:有没有办法用一个更干净(更尴尬)的语法来完成这个.

不幸的是,您不能显式定义通用函数的类型(通过使用< ...>语法).但是,您可以提供一个通用元类型(T.Type)作为函数的参数,以便允许Swift将该函数的通用类型推断为 Roman has said.

对于您的具体示例,您将希望您的功能如下所示:

extension Sequence {    func first<T>(ofType _: T.Type) -> T? {        return lazy.flatMap{  as? T }.first    }}let a: [Any] = [5,6.7]print(a.first(ofType: Double.self) as Any) // Optional(6.7000000000000002)

在这里,我们使用flatMap(_ :)来获取成功转换为T的元素序列,然后首先获得该序列的第一个元素.我们也使用懒惰,以便我们可以在找到第一个元素后停止评估元素.

使用示例

请注意,您必须使用.self才能引用特定类型(在本例中为SomeProtocol)的元类型.也许不是一个光滑的语法,你的目标是,但我认为这是一样好,你会得到.

虽然在这种情况下值得注意的是,该功能将更好地放在Sequence的扩展中:

总结

以上是内存溢出为你收集整理的在Swift中使用类型名称的通用功能全部内容,希望文章能够帮你解决在Swift中使用类型名称的通用功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1027436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存