web-dev-qa-db-ja.com

iOS:Swiftでオブジェクトクラスを作成

オブジェクト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が見つかりました」というメッセージで名前を設定するとクラッシュする

17
CrazyDev

これは実際には答えではありません(@Gregや@zelibのようなソリューションに関する他の答えを参照してください)が、コードに見られるいくつかの間違いを修正する試みです

  1. 計算された+保存されたプロパティを作成する必要はありません(その理由がない限り):

    class City: NSObject {
        var name: String = ""
    }
    
  2. NSObjectから継承すると、自動的にすべてのSwiftの機能が失われます-それを避けてください(その理由がない限り)

    class City {
        var name: String = ""
    }
    
  3. 値の欠如として空の文字列を使用しています-Swift提供 オプション そのため

    class City {
        var name: String?
    }
    
  4. 3.の代わりに、名前のない都市はあまり意味がないので、おそらく各インスタンスに名前を付ける必要があります。オプションではないプロパティと初期化子を使用します。

    class City {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
  5. 暗黙的にラップされていないオプションを避けてください(その理由がない限り)。

    var city: City
    
29
Antonio

他のオブジェクト指向プログラミング言語と同様に、オブジェクトはアクセスする前に初期化する必要があります。
同様:

var city:City!

これは単にオブジェクトの参照です。したがって、実際のメモリはここでは作成されません。 Cityクラスの実際のオブジェクトを作成する必要があります。

次のステートメントを追加して修正します。

city = City()
10
Mithra Singam

City変数を初期化しておらず、使用しようとするとクラッシュします。

使用する前にまず初期化します。

city = City()
city.name = "London"
6
Greg

都市変数を初期化するのではなく、どの段階でも初期化せずに暗黙的にラップを解除するため、エラーが発生します。初期化するには、次のコードを使用する必要があります

var city:City = City()
3
Zell B.

Initメソッドを呼び出す必要があります。だからあなたはこのようにそれをするでしょう:

var city:City=City() //Calls init and creates an instance
city.name="foo"

Initメソッドを定義しない場合(常に行うことをお勧めします)、デフォルトのinitメソッドが呼び出されます。

1
Dhruv Ramani