2016-07-23 27 views
0

我在java中有一些編碼良好的代碼,所以它可以幫助我管理源代碼以及在未來輕鬆擴展。這些代碼如下如何組織模式中的swift源代碼?

public interface IDataModel<T extends IDataModel> { 
    void copyData(T data); 
    long getUpdatedTime(); 
} 


public abstract class AbstractDataModel<T extends IDataModel> implements IDataModel<T>{ 
    protected long updatedTime; 

    public long getUpdatedTime(){ 
    return updatedTime; 
    } 
} 

public class concreteDataA extends AbstractDataModel<concreteDataA>{ 
    String property1; 

    public String getProperty1(){ 
    return property1; 
    } 

    @override 
    public void copyData(concreteDataA data){ 
    property1 = data.getProperty1(); 
    updatedTime = data.getUpdatedTime(); 
    } 
} 

現在我想進入iOS Swift 3.0。如上所述是否可以在swift 3.0中組織代碼?或者是否有任何等效的方式來迅速組織代碼如上?我對swift iOS很陌生,因此很難組織模式中的源代碼。謝謝。

+0

是的,這是可能的,但總的來說,Swift比Java有更好的組織代碼的方式,主要是因爲使用協議的擴展和更好的抽象。您不能創建抽象類,但可以爲協議方法添加默認實現。 – Sulthan

+0

「組織」,縮進意味着什麼?控制+我,在Xcode會正確縮進您的代碼。 – Idan

+0

謝謝@Sulthan,你可以給我一個與swift相同的代碼樣本嗎? – MichaelP

回答

2

你沒有提供太多的上下文,但似乎你正在努力開發一個「面向協議」的解決方案,因爲Swift人喜歡稱這種模式。這裏有可能會解決你的問題(擾流板 - 我認爲這個問題是在你的設計)兩個選擇:

接口:協議,抽象類:協議擴展

就像提到@sulthan,你當然可以去類似的地方使用默認的實現協議,就像這樣:

protocol DataModel { 
    mutating func copy(data: Self) 
    var updatedTime : Float { get } 
} 

extension DataModel { 
    var updatedTime : Float { return 0 } 
} 

但是,你會碰到一個問題,當你試圖實現ConcreteDataModel因爲要專注它佔property1值ISN」在協議中提到。你的選擇是放寬ConcreteDataModel(也就是說不要那樣做)或使用類型轉換的要求。 請注意,打擊斯威夫特的打字系統是一個肯定的跡象,你的代碼不是慣用的!你應該看到這種困難,因爲語言會促使你重新考慮你的方法。

使用不可變的數據類型

這是最直接的答案。如果你上面描述的實際上是你的應用程序的具體例子,那麼你根本不需要任何協議。 (事實上​​,你的Java實現肯定是過度抽象的。)Swift struct s是不可變的,這意味着只要你改變它們,你實際上正在改變一個副本。

struct DataModel { 
    let updatedTime: Float 

    mutating func update(time: Float) { 
     self = DataModel(updatedTime: time) 
    } 
} 

var data1 = DataModel(updatedTime: 3) 
var data2 = data1 
data2.update(time: 17) 
print(data1.updatedTime) // 3.0 
print(data2.updatedTime) // 17.0 

型號您從您的數據

這是廣義的解決方案除了行爲。從設計角度來看,顯然你有兩個不同的問題。你想要一些可複製的東西,並且你想要追蹤「時間」的東西。爲什麼不讓你的代碼反映這一點?

protocol Copier { 
    associatedtype Data 
    func copy(from: Data) -> Data 
} 

protocol Clock { 
    var time: Float { get } 
} 

class AlarmClock: Clock, Copier { 
    let time: Float 
    let alarm: Float 

    init(time: Float, alarm: Float) { 
     self.time = time 
     self.alarm = alarm 
    } 

    func copy(from: AlarmClock) -> AlarmClock { 
     return AlarmClock(time: from.time, alarm: from.alarm) 
    } 
} 

當然,你甚至可以走的最後一步,爲Clock.time提供的默認實現,如果你真的需要它。