2017-09-12 64 views
0

我很困惑,我遇到过几次。我有时会收到类似以下无法转换类型'Foo!'的值到预期的参数类型'Foo!'

Cannot convert value of type 'Foo!' to expected argument type 'Foo!

'

我已经搜查SO错误,但还没有真正发现任何可以解释为什么富!和Foo不一样!

下面是一个例子:

// FooViewModel.swift 
class FooViewModel: BaseViewModel { 
    fileprivate var foo: Foo! 
    fileprivate var bar: Bar = Bar() 

    init!(model: Foo!) { 
     super.init() 
     foo = model 
    } 

    override init() { 
     super.init() 
    } 

    func setFooModel(_ model: Foo!) { 
     self.foo = model 
    } 

    func getFooModel() -> Foo! { 
     return self.foo 
    } 

    func getBar() -> Bar { 
     return bar 
    } 

    func getBlah() -> String { 
     return "Blah" 
    } 
} 

这里是单元测试生成错误:

import XCTest 
@testable import WooHoo 

class FooViewModelTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testGetBar() { 
     var foo = Foo() 
     let vm = FooViewModel() 

     // The following line generates the error 
     vm.setFooModel(foo) 

     XCTAssertEqual("Tell us your Foo for the Bar program.", vm.getBlah()) 
    } 
} 

我已经尝试了多种变型为vm.setFooModel(foo)无济于事,例如vm.setFooModel(foo!)或将foo声明为var foo: Foo! = Foo()

编辑: 请注意,上面的代码是用于说明我遇到的问题,而不是操作代码。

+0

“Foo”类型声明在哪里?是否有可能在不同范围内声明多个'Foo'? –

+2

我认为在声明变量foo时只需要使用'Foo!',而在其他地方只需使用'Foo' – 3stud1ant3

+0

'setFooModel'和'getFooModel'方法有什么意义?为什么不公开'foo'属性? 'getBar'方法相同。为什么不简单地使公共阅读访问的'bar'属性? – rmaddy

回答

0

我明白了这一点。我的视图模型是测试目标的一部分。将其设置为仅限运行目标后,问题就解决了。仅供参考。

相关问题