オブジェクトCityに対してこのクラスを作成しました
class City: NSObject {
var _name:String = ""
var name:String {
get {
return _name
}
set (newVal) {
_name = newVal
}
}
}
次に、オブジェクトを作成するときに次のことを行います。
var city:City!
city.name = "London" //crash here
println("name city is\(city.name)");
「致命的なエラー:オプション値のラップ解除中に予期せずnilが見つかりました」というメッセージで名前を設定するとクラッシュする
これは実際には答えではありません(@Gregや@zelibのようなソリューションに関する他の答えを参照してください)が、コードに見られるいくつかの間違いを修正する試みです
計算された+保存されたプロパティを作成する必要はありません(その理由がない限り):
class City: NSObject {
var name: String = ""
}
NSObject
から継承すると、自動的にすべてのSwiftの機能が失われます-それを避けてください(その理由がない限り)
class City {
var name: String = ""
}
値の欠如として空の文字列を使用しています-Swift提供 オプション そのため
class City {
var name: String?
}
3.の代わりに、名前のない都市はあまり意味がないので、おそらく各インスタンスに名前を付ける必要があります。オプションではないプロパティと初期化子を使用します。
class City {
var name: String
init(name: String) {
self.name = name
}
}
暗黙的にラップされていないオプションを避けてください(その理由がない限り)。
var city: City
他のオブジェクト指向プログラミング言語と同様に、オブジェクトはアクセスする前に初期化する必要があります。
同様:
var city:City!
これは単にオブジェクトの参照です。したがって、実際のメモリはここでは作成されません。 Cityクラスの実際のオブジェクトを作成する必要があります。
次のステートメントを追加して修正します。
city = City()
City変数を初期化しておらず、使用しようとするとクラッシュします。
使用する前にまず初期化します。
city = City()
city.name = "London"
都市変数を初期化するのではなく、どの段階でも初期化せずに暗黙的にラップを解除するため、エラーが発生します。初期化するには、次のコードを使用する必要があります
var city:City = City()
Initメソッドを呼び出す必要があります。だからあなたはこのようにそれをするでしょう:
var city:City=City() //Calls init and creates an instance
city.name="foo"
Initメソッドを定義しない場合(常に行うことをお勧めします)、デフォルトのinitメソッドが呼び出されます。