swift - 当类型是关联类型时,无法将类型的值转换为预期的参数类型

标签 swift

这是swift 4代码:

protocol BarProtocol {
    associatedtype Bar
    var bar:Bar? {get set}
}

class FooClass : BarProtocol {
    //typealias Bar = (String) -> ()
    typealias Bar = (String)
    var bar: Bar?
}

func configFooClass<T:BarProtocol>(fooClass:inout T, bar:T.Bar) {
    fooClass.bar = bar
}
func setupFooClass(fooClass:inout FooClass, bar:FooClass.Bar) {
    configFooClass(fooClass: &fooClass, bar: bar)
}

var fooClass = FooClass()
var barString = "barString"
//let barAction:(String) -> () = { text in
//    print(text)
//}

setupFooClass(fooClass:&fooClass, bar:barString)
print(fooClass.bar) // print: Optional("barString")

到目前为止一切顺利,它将在控制台中打印“Optional("barString")”。 FooClass类中的关联类型现在是String类型,因此它可以存储字符串值“barString”。

但是如果我将此代码更改为:

protocol BarProtocol {
    associatedtype Bar
    var bar:Bar? {get set}
}

class FooClass : BarProtocol {
    typealias Bar = (String) -> ()
//    typealias Bar = (String)
    var bar: Bar?
}

func configFooClass<T:BarProtocol>(fooClass:inout T, bar:T.Bar) {
    fooClass.bar = bar
}
func setupFooClass(fooClass:inout FooClass, bar:FooClass.Bar) {
    configFooClass(fooClass: &fooClass, bar: bar) 
// Error here: Cannot convert value of type '(String) -> ()' to expected argument type '_.Bar'
}

var fooClass = FooClass()
var barString = "barString"
let barAction:(String) -> () = { text in
    print(text)
}

//setupFooClass(fooClass:&fooClass, bar:barString)
//print(fooClass.bar)
setupFooClass(fooClass:&fooClass, bar:barAction)
fooClass.bar!("lalalalala")

实际上,我只是将 FooClass 的关联类型从 String 更改为 (String) -> (),就会出现错误: Cannot conversion value of type '(String) -> ()' to Expected argument type '_.Bar '

我不明白,似乎闭包可以作为函数的参数传递。但为什么 'String' 类型工作得很好,而 '(String) -> ()' 却不行?

最佳答案

看来添加@escaping可以解决这个问题...

func setupFooClass(fooClass:inout FooClass, bar:@escaping FooClass.Bar) {
    configFooClass(fooClass: &fooClass, bar: bar)

}

关于swift - 当类型是关联类型时,无法将类型的值转换为预期的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48658969/

相关文章:

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ios - 如何以编程方式在 swift ios 中自动将光标从一个文本字段移动到另一个文本字段?

ios - 如何在 Realm Swift 中将子类添加到 List<superclass>

swift - 使用 URL 显示文件的元数据

ios - iPhone 和桌面应用程序中带有角标(Badge)的 APNS

iOS 13新的呈现风格将状态栏变成浅色内容

swift - 无法推断通用参数 'FalseContent'

ios - 为什么我的指示器在加载网页 View 时不起作用?

iOS 快速指针

ios - 如何在swift中获取类型字典数组的键