我在Swift中为UIView创建了一个扩展。任何人都知道如何将该文件导入我的UIViewController?
我想在控制器文件中导入扩展文件,这样我就可以重用扩展文件了。例如,像这样的结构:
UIViewExtension.swift
import UIKit
extension UIView {
var myVar : Float {
get {
return myVar
}
set (newMyVar) {
myVar = newMyVar
}
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var squareView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
squareView.myVar = 50
self.view.addSubview(squareView)
println("Offset: \(squareView.myVar)")
}
}
这是编译器给出的错误:
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254
答案 0 :(得分:8)
这里有几件事。
您只能将计算属性添加到扩展程序。这意味着您实际上没有要分配或读取的myVar。因此,当您访问myVar
时,您实际上无限递归。这实际上就是警告所暗示的内容(虽然模糊不清):
warning: attempting to access 'myVar' within its own getter
return myVar
^
据我所知,无法使用扩展名为类型添加非计算属性。 Objective-C也是如此,其中实际存储使用类扩展添加到类的属性的唯一方法是通过objc_getAssociatedObject
和来自objc_setAssociatedObject
的{{1}}使用Objective-C对象关联}。
如果扩展程序的计算属性有一个setter,那么编译器中肯定存在一个错误。重现错误的最小工作示例,不包括递归(通过消除对myVar的访问)并忽略该值是:
objc/runtime.h
答案 1 :(得分:2)
我也遇到过这个问题。它似乎是一个编译器错误。如果您在独立扩展文件中计算了属性,编译器似乎会崩溃。我找到的解决方法是在非独立文件中创建扩展。因此,在这种情况下,您可以将扩展名移动到ViewController.swift文件中。像这样:
import UIKit
extension UIView {
var myVar : Float {
get {
return myVar
}
set (newMyVar) {
myVar = newMyVar
}
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var squareView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
squareView.myVar = 50
self.view.addSubview(squareView)
println("Offset: \(squareView.myVar)")
}
}
答案 2 :(得分:0)
在左侧的Project导航器中选择Xcode中的文件后,请确保检查应用程序并在右侧的Inspector视图的Target Membership部分中进行测试。
如果没有检查,那么它将不会包含在项目中,因此您将收到编译错误。
答案 3 :(得分:-1)
在属性声明前使用 static 似乎可以解决问题。
extension UIView {
static var myVar : Float {
get {
return myVar
}
set (newMyVar) {
myVar = newMyVar
}
}
}
希望它有所帮助!