2016-03-21 170 views
2

我有兩個類ClassOne和ClassTwo。我想初始化一個不同取決於變量的值,我想要做的事,如:根據變量選擇類

if(a == "0") { 
let b = ClassOne(); 
}else{ 
let b = ClassTwo(); 
} 

而無需將其每次我需要它寫。例如: 讓b = MainClass() 並根據情況被稱爲ClassOne()ClassTwo(),a是一個全局變量。

回答

3

爲了這個工作,這兩種類型應該通過擴展一個公共基類或通過實現相同的協議來關聯。此外,b的後續操作將僅限於這兩個類別的共同點。

如果你是這個限制很好,你可以做這樣的:按照mattadvise你可以放棄所有以上的贊成完全動態的方法:

protocol CommonProtocol { 
    func foo() -> Double 
    var bar : Int { get } 
} 
class ClassOne : CommonProtocol { 
    ... 
} 
class ClassTwo : CommonProtocol { 
    ... 
} 
func MainClass() -> CommonProtocol { 
    if(a == "0") { 
     return ClassOne() 
    } else { 
     return ClassTwo() 
    } 
} 
... 
let b = MainClass() 
b.foo() 
print(b.bar) 

注。

+0

沒有必要爲此,人們可能會認爲,作爲CommonProtocol已經存在。它被稱爲AnyObject。但是,當然(正如我在我的回答中所說的)必須以某種方式提取底層對象才能使用它。 – matt

+1

@matt這絕對是真的。但是,它沒有專門針對你的應用的方法,所以我不願意提及它,即使它可以讓你調用任何「id」風格的東西。 – dasblinkenlight

+0

在我的回答中,_I_甚至不想提及_that_。我認爲這裏的整個目標本身就是一種難聞的氣味。 :) – matt

0

您可以使用三元運算迅速做到這一點,不過,你需要每次都做到這一點:

let b = (a == 0) ? ClassOne() : ClassTwo() //If a==0 let b = ClassOne if not let b= ClassTwo. 
1

你可以做到這一點,但它不會是沒有進一步的努力是有用的。考慮以下內容:

class ClassOne {} 
class ClassTwo {} 

現在我們繼續初始化一個變量作爲其中一個類的實例。要做到這一點,我們必須鍵入變量AnyObject:

var which : Bool { return true /* or false */} 
let obj : AnyObject 
switch which { 
    case true: 
     obj = ClassOne() 
    case false: 
     obj = ClassTwo() 
} 

你現在有obj無論是作爲ClassOne實例或ClassTwo實例。但是有一個問題。你不知道它是哪個。 AnyObject輸入保留真正的底層類型(多態),但它也是隱藏的類型。每當您使用obj時,您將必須測試無論它是ClassOne還是ClassTwo,並且都會將其轉換爲該類型以便使用它。

if obj is ClassOne { 
    (obj as! ClassOne).doSomethingClassOneKnowsHowToDo() 
} 

問題是:疼痛是否值得?我建議你首先要做到這一點的願望可能是一種難聞的氣味,你應該修改你想要的建築。嚴格的靜態輸入是Swift的要點;你想扔掉它是錯誤的。

+0

感謝您的答覆馬特和@dasblinkenlight,我只是想從兩個不同的網站獲取數據,所以我有兩個類,在具有相同名稱的函數內做不同的事情。你有更好的解決方案嗎?對不起,但我是Swift的新手。 – Zac

0

@dasblinkenlight解決方案是偉大的,但你也可以做這樣的

protocol MyProto { 
var x: Int { get } 
} 

class A: MyProto { 
var x = 10 
var y = 10 
} 

class B: MyProto { 
var x = 20 
} 

class Demo { 
var type: MyProto! 

init(str: String) { 
    if str == "0" { 
     type = A() 
    } else { 
     type = B() 
    } 
} 
} 

....

let obj = Demo(str: "0").type 
print(obj.x)