2015-01-02 52 views
1

是否可以修改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) 
    } 
} 

有沒有一種方法,我可以添加這些功能雨燕語言本身,所以我可以在每個文件訪問它們無須思考的問題?謝謝!

+1

子類,類別,函數與方法,模塊。永遠不要將一個函數從代碼的一個地方複製粘貼到代碼的另一個地方。在任何編程語言中。 – Sulthan

回答

2

在一個文件中只是聲明你的功能,如delay的功能,沒有任何類或結構內。這不是Java,功能沒有:-)

雨燕標準庫是全功能,它不住內部類,像printlnmap被陪護,sort(那些後兩者相似在Array上的方法,但在任何類型的集合上工作)。

這並不是真的「修改」Swift。這就是Swift的工作原理 - 定義函數並使用它們。沒有規定你必須使用類。

+0

沒有工作,因爲'alertWith ...'函數在沒有類的情況下無法工作。具體來說,因爲'自我......' –

+0

你不必使用自我。把這個班作爲參數。 –

+0

我會用什麼類型? –

1

您是否考慮過使用Swift的​​?

擴展插件爲現有類,結構或枚舉類型添加新功能。這包括擴展您無法訪問原始源代碼的 類型(稱爲 追溯建模)的功能。擴展名與 Objective-C中的類別相似。 (與Objective-C的類別,斯威夫特分機不 有名字。)

+2

雖然擴展很酷,但不要以爲要存在一個函數,它必須寫成類或結構的擴展。你的'delay'函數是一個真正的免費函數,而不是你應該擴展的類。 –

+0

@AirspeedVelocity那麼你認爲擴展的好用是什麼?只能在類或結構中擴展函數? –

+0

如果某個函數真的覺得它「屬於」某個特定的類或結構,請使用擴展名。如果函數的第一個最重要的參數是特定的類/結構,那麼這可能是一個很好的擴展。如果所有的參數都是相同的,那麼這是一個自由函數。另外,目前的某些擴展功能無法完成,比如受約束的泛型函數,它們必須是自由函數(希望有某種特性 - 比如在將來的某個時候編寫擴展協議的能力) –

-1

您應該可以使用Swift的​​功能。

正如Apple的開發人員網站所描述的,擴展允許您使用協議擴展現有類型。例如,擴展Double數據類型以包含單位轉換函數。

你應該能夠在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,您並不需要在擴展中定義它。正如Airspeed Velocity指出的那樣,它可能是另一個* .swift文件中的一個鬆散的函數。它不依賴於UIViewController實例,所以沒有理由將其添加到每個實例中。

+2

「然後,上面的代碼擴展了'UIViewController'和'LanguageModifications'的定義」不太一樣 - 你實際上也必須實現這些功能,你不能實現'LanguageModifications'一次,然後混合到多個類中,就像 –

+0

感謝您接觸@AirspeedVelocity!我更新了我的答案以反映這一點,並提及了您對延遲的評論。 – robodude666