修改Swift本身

时间:2015-01-02 23:41:14

标签: function swift

是否可以修改Swift本身?

我一直使用一些函数,而不是通过在代码段库中复制和粘贴或我的用户集合将这些函数添加到每个.swift文件中,我想让它们成为顶级函数功能

为了尝试实现这一点,我创建了一个包含这些函数的LanguageModifications.swift文件。这最初起作用,但它只是在提出观点和过度复杂的问题时结束。

LanguageModifications.swift

import Foundation
import UIKit

class LanguageModifications: UIViewController {
    // Timed delays
    func delay(delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }

    // Alert
    func alertWithTitleAndMessage(title: String, message: String) {
        var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

有没有办法可以将这些函数添加到Swift语言本身,这样我就可以在没有想到的情况下在每个文件中访问它们?谢谢!

3 个答案:

答案 0 :(得分:2)

只需将delay之类的函数声明为文件中的函数,而不是任何类或结构中的函数。这不是Java,函数不必被陪伴: - )

Swift标准库中充满了不在类内部的函数,例如printlnmapsort(后两者与{{1上的方法类似)但是,这适用于任何类型的集合。)

这并不是真正“修改”Swift。这就是Swift的工作原理 - 定义函数并使用它们。没有规则你必须使用类。

答案 1 :(得分:1)

您是否考虑过使用Swift' Extensions

  

扩展程序为现有类,结构或添加新功能   枚举类型。这包括扩展其类型的能力   您无权访问原始源代码(称为   追溯建模)。扩展类似于中的类别   Objective-C的。 (与Objective-C类别不同,Swift扩展不会   有名字。)

答案 2 :(得分:-1)

您应该可以使用Swift的Extensions功能。

正如Apple的开发者网站所描述的那样,扩展允许您使用协议扩展现有类型。例如,扩展Double数据类型以包含单位转换funcs。

你应该能够在UIViewController的扩展中定义你的alertWithTitleAndMessage func:

extension UIViewController: LanguageModifications {
    // Alert
    func alertWithTitleAndMessage(title: String, message: String) {
        var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

以上内容将扩展UIViewController并添加alertWithTitleAndMessage的定义。

对于delay,您实际上不需要在扩展程序中定义它。它可以是另一个* .swift文件中的松散函数,如Airspeed Velocity所指出的那样。它不依赖于UIViewController实例,因此没有理由将其添加到每个实例中。