在单独的.swift文件中使用扩展

时间:2014-06-10 05:11:13

标签: ios xcode swift

寻找在单独的文件或替代解决方案中使用Swift扩展的方法。只有在将扩展名写入正在使用的文件中时,才能创建扩展。

以下是适用的ViewController.swift示例。

import UIKit
var TestHelper: String = "Start Value"
extension UIView {
var testValue:String{
set{
    TestHelper = newValue
}
get{
    return  TestHelper
}
}
}

class ViewController: UIViewController {
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.testValue = "Some Value"
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

将扩展名从此文件中取出并放入新文件会导致出现此错误:

Program ended with exit code: 9

这个错误说我认为它并不存在。在扩展所需的每个单独文件中创建扩展名显然会产生无效重新声明的问题。

提前致谢!

4 个答案:

答案 0 :(得分:3)

如果您将扩展程序移动到另一个文件,那么您也必须移动TestHelper。或者更简单:将TestHelper放入扩展名

答案 1 :(得分:2)

我尝试了这个问题,认为这很容易,但似乎比我原先想象的要复杂得多。

我最终不得不继承UIView。我无法为添加了var的UIView创建扩展。我想也许他们强迫我们继承UIView,因为init或get / set如何为类工作。我刚刚做到了这一点。它不一样,但具有相同的功能

import UIKit

class MyView: UIView {
    var testValue: String?
    init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.greenColor()
        self.bringSubviewToFront(self.superview)
    }
}

然后将其用作

override func viewDidLoad() {
    super.viewDidLoad()

    let myRect = self.myContent.frame
    let myNewView: MyView = MyView(frame: myRect)
    myNewView.testValue = "has been set"
    self.myView.addSubview(myNewView)

    NSLog("%@", myNewView.testValue!)

}

我可以使用var

扩展Array
extension Array {
    var last: T? {
    if self.isEmpty {
        NSLog("array crash error - please fix")
        return self [0]
    }
    else {
        return self[self.endIndex - 1]
        }
    }
}

如果只添加函数而不是变量

,则很容易为UIKit创建扩展
extension UIView {
    func layerborders() {
        let layer = self.layer
        let frame = self.frame
        let myColor = self.backgroundColor
        layer.borderColor = UIColor.whiteColor().CGColor
        layer.borderWidth = 0.8
        layer.cornerRadius = frame.width / MyConstants.CornerRadius.toRaw()
    }
}

答案 2 :(得分:2)

我也遇到了同样的错误并试图解决它我发现在扩展变量声明前添加 static 似乎可以解决问题:

import UIKit

static var TestHelper: String = "Start Value"

extension UIView {

    static var testValue: String {
        set {
            TestHelper = newValue
        }
        get{
            return  TestHelper
        }
    }

}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.testValue = "Some Value"
    }

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

}

希望它有所帮助!

答案 3 :(得分:2)

“扩展程序无法添加存储的属性”(来自"The Swift Programming Language"