2017-02-12 18 views
0

変数を使用して変換を使用することはありますか?私は "AnyObject"の型を使用してオブジェクトスタッキングを使用しています。クラス型を取り、変数を設定できました。今私は変換を使用して配列に値を設定する必要があります。変数を使用したSwift変換

var myString = "Hello World" 
var objectStack = [AnyObject]() 

objectStack.append(myString) 

let currentObject = String(describing: objectStack.last!) 
var objectType = String() 
let range: Range<String.Index> = currentObject.range(of: ":")! 
objectType = currentObject.substring(to: range.lowerBound) 
let range2: Range<String.Index> = objectType.range(of: ".")! 
objectType = objectType.substring(from: range2.upperBound) 

上記のコードは、クラスを評価し、 "objectType"の値を "String"に設定します。今私は別の道を行くことを試みている。このようなもの:

for obj in objectStack{ 
    obj = newObject as! objectType //this doesn't work 
} 

これは何か可能ですか?

+0

まあ、いや、 'objectType'は' STRING'とではありませんので、メタタイプ。しかし、たとえそれがメタタイプであったとしても、それは実行時まで価値が分からないため、コンパイル時にどのように使用されますか?別の言い方をすれば、 'obj'が静的に*型指定されているとはどういうことでしょうか? – Hamish

+0

@ハミッシュ、私は非常によくこれについて間違った方法で行くことができます。おそらく、私はそれを再考し、ドローイングボードに戻る必要があります。 – GED125

+0

おそらく、一般的には、「Any」/「AnyObject」の使用を避けるべきです。「あなたに利用可能な記述型がほとんどあります」(http://stackoverflow.com/q/37299843/2976878)。 'objectStack'に入れようとしている値のタイプは何ですか?彼らは何らかの形で関連していますか? – Hamish

答えて

0

これが私の仕事:

var instance: AnyObject! = nil 
let classInst = NSClassFromString(objectType) as! NSObject.Type 
instance = classInst.init() 
0

タイプを取得するためのシンプルな、より安全な方法があります:

let type = type(of: objectStack.last!)  // String.Type 
let typeString = String(describing: type) // "String" 

オブジェクトの型がコンパイル時に知られていないため、他の方法で回避は不可能です。キャストしようとしているいくつかの既知のタイプがありますか?その場合には、キャストが成功したかどうかを確認するには、オプションのバインディングを使用します。

let object = objectStack.last! 
if let string = object as? String { 
    // do String stuff 
} 
else if let i = object as? Int { 
    // do Int stuff 
} 
// and so on 

あなたには、いくつかの共通の機能を共有可能なタイプが多数ある場合:使用するプロトコルを。素晴らしい紹介については、Swift Documentationを参照してください。

あなたはさまざまな種類が実装することができますいくつかの一般的な機能のためのプロトコルを定義します。

protocol Stackable { 
    func doStuff() 
    // (more methods or properties if necessary) 
} 

プロトコルは、このプロトコルに準拠するすべてのタイプが宣言されたすべてのメソッドとプロパティの実装を提供することで、満たさなければならない契約を提供します。さんはStackableに準拠して構造体を作成してみましょう:

struct Foo: Stackable { 
    func doStuff() { 
     print("Foo is doing stuff.") 
    } 
} 

あなたはまた、彼らはプロトコルに準拠するために、既存の型を拡張することができます。さんはStringStackableを作ってみましょう:

extension String: Stackable { 
    func doStuff() { 
     print("'\(self)' is pretending to do stuff.") 
    } 
} 

はのは、それを試してみましょう:

let stack: [Stackable] = [Foo(), "Cat"] 

for item in stack { 
    item.doStuff() 
} 

/* 
prints the following: 
    Foo is doing stuff. 
    'Cat' is pretending to do stuff. 
*/ 
+0

これは私が現在行っていることですが、スイッチを使用しています。問題は、アプリケーションに多数のオブジェクトタイプが存在することです。私はそれぞれのスイッ​​チケースを構築する必要はないと考えていましたが、それは避けられないように見え始めていますか? – GED125

+0

オブジェクトタイプに共通の機能がありますか?はいの場合:プロトコルを使用します。 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html – nils

+0

ありがとうございます。私はこれを研究し始めるでしょう。私はそれを1日と呼ぶ必要があると思う、私の頭はそのようなnewbから傷つき始めている。;) – GED125

関連する問題