2017-09-02 9 views
1

私はAppleのApp Developmentを使っています。Swift iBookでは構造体の章まで、特にプロパティオブザーバのセクションまでかなりスムーズなセーリングが行われています。私は単位変換をチェックすることが任されています。引数なしでHeight型のイニシャライザを呼び出せません

struct Height { 
    var heightInInches: Double { 
     willSet(imperialConversion) { 
      print ("Converting to \(imperialConversion)") 
     } 
     didSet { 
      if (heightInInches == (heightInCentimeters * 0.393701)) { 
       print ("Height is \(heightInInches)") 
      } 
     } 
    } 
    var heightInCentimeters: Double { 
     willSet(metricConversion) { 
      print ("Converting to \(metricConversion)") 
     } 
     didSet { 
      if (heightInCentimeters == (heightInInches * 2.54)) { 
       print ("Height is \(heightInCentimeters)") 
      } 
     } 
    } 
    init(heightInInches: Double) { 
     self.heightInInches = heightInInches 
     self.heightInCentimeters = heightInInches*2.54 
    } 

    init(heightInCentimeters: Double) { 
     self.heightInCentimeters = heightInCentimeters 
     self.heightInInches = heightInCentimeters/2.54 
    } 
} 

let newHeight = Height() 
newHeight.heightInInches = 12 

書籍とSwiftのドキュメントから、これはうまくいくと思います。しかし、次のようなエラーメッセージが表示されます。

"引数なしで '高さ'タイプのイニシャライザを起動できません。

  1. これはどういう意味ですか、私は何を誤解していますか?
  2. これを修正するにはどうすればよいですか?下部の
+0

@シェードが正しいです。このシナリオでは、 'Height'が' Class'のように動作すると考えることができます。 'init(heightInIches:)'と 'init(heightInCentimeters:)'という2つのinitsを定義しているので、そのようなnewHeightを "インスタンス化"することはできません。 (*でも*を使うことができると付け加えますが、2行目のコードでは最初のinitが必要であることを示唆しています。 – dfd

答えて

0

あなたの1行は次のようになります。

let newHeight = Height(heightInInches: 12) 

heightInInchesあなたはinitメソッドに渡している引数です。

+0

Ok!私はそれを入力したようですが、文字列( "Converting to ..." –

+0

@MichaelFarrisこの本の中の注釈を見たことがありますか(強調表示):* "スーパークラスのプロパティのwillSetとdidSetオブザーバは、プロパティがaに設定されているときに呼び出されます。スーパークラスの初期化子が呼び出された後でクラスが独自のプロパティを設定している間は呼び出されません** " – rmaddy

関連する問題