'ViewController - > () - > VIewController'没有名为'view'的成员

时间:2015-05-16 14:53:51

标签: ios swift

我正在使用swift设置BLKFlexibleHeightBar。当我写var flexibleHeightBar = BLKFlexibleHeightBar(frame: CGRectMake(0, 0, self.view.frame.size.width, 100))时,标题出现时出错。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

frame应该是CGRect,而你没有提供。您的frame: 0, 0, self.view.frame.size.width, 100只是一系列数字,而不是CGRect。斯威夫特不知道这些数字在那里做了什么。如果你想要一个CGRect - 你做了 - 你必须这样说:

frame: CGRectMake(0, 0, self.view.frame.size.width, 100)

答案 1 :(得分:1)

该错误显然与您对self.view的调用有关,根据错误,编译器认为self的类型为ViewController -> () -> ViewController,而不是您可能期望的那样是ViewController

你在哪里写这段代码?

如果您是在init代码或static func的{​​{1}}中编写的,那么在该上下文中ViewController不是self的实例别的东西。并且考虑到您编写该代码的位置,ViewController并不代表您self.view的实例ViewController属性,可能是因为view不是'创造了。

您需要将代码从self(正在创建init()实例但尚未准备好的地方)移至self(一旦viewDidLoad' s ViewController刚刚创建。)

view类型

的技术说明

如果你想获得更多的技术并理解为什么编译器期望ViewController -> () -> ViewController在你的错误中属于那种类型,那么在Swift中,实例方法实际上也作为类方法公开它将一个实例作为参数并返回实例方法(该机制被称为" currying")。

例如,self类具有类型为String的实例方法hasPrefix。它也作为一个类方法公开,它期望String -> Bool实例并返回在该实例上应用的上述实例方法;因此String的类型为String.hasPrefixString -> String -> Bool严格等同于String.hasPrefix("Hello world")("Hello")(是的,我知道一开始看起来很奇怪,但这很有意义)。 当然,一般来说,你很少(如果有的话)在你的日常代码中使用它,这只是Swift很少使用的功能,但它就在那里。

回到上下文,您使用"Hello world".hasPrefix("Hello")的{​​{1}}方法。 init实际上是(特殊)实例方法(ViewController之前没有init() / static),在这种情况下,不带参数(class)并将返回init个实例,因此其类型为()。此实例方法也可以解释为类型为ViewController的类方法(在() -> ViewController类上),因为在幕后它将使用(未初始化的,新分配的){{{ 1}}并将返回一个函数(ViewController),一旦调用(没有参数,ViewController -> () -> ViewController),将返回ViewController的初始化实例。

这就是init来自上面的错误消息的地方。