

Appleのドキュメントを読んでいますが、理解できません。  
[ドキュメント](https://developer.apple.com/documentation/combine/published)

[code]

    class Weather {
        @Published var temperature: Double
        init(temperature: Double) {
            self.temperature = temperature
        }
    }
    
    let weather = Weather(temperature: 20)
    cancellable = weather.$temperature
        .sink() {
            print ("Temperature now: \($0)")
    }
    weather.temperature = 25
    
[/code]

これを実行すると、  
// Temperature now: 20.0  
// Temperature now: 25.0  
と返されるのですがなぜ、20.0も返されるのでしょうか？  
Weatherクラスを生成した後、つまり既にtemperatureに値は入って後にパブリッシャーを登録しているので  
20に関してはパブリッシャーが機能しないと思っていますが実際は、20も出力されます。

分かる方ぜひご教授お願いいたします。


CC BY-SA 4.0
2022-03-27T15:31:37.797
88049
2022-05-04T11:14:08.043
47147
question
swift swiftui combine
SwiftUIの@Publishedついて


weather.temperatureはCurrentValueSubjectなのでしょうねぇ。  
[Subject | Apple Developer
Documentation](https://developer.apple.com/documentation/combine/subject)

期待された動作は、もう一つのSubject、PassthroughSubjectの方の様ですが。  
e.g.

[code]

    let relay = PassthroughSubject<String, Never>()
    
    relay.send("Hello") // no output
    let subscription = relay
        .sink { value in
            print("subscription1 received value: \(value)")
    }
    
    relay.send("World!") // => World!
    
[/code]

比較のコード

[code]

    let variable = CurrentValueSubject<String, Never>("")
    
    variable.send("Initial text")
    
    let subscription2 = variable.sink { value in
        print("subscription2 received value: \(value)")
    }
    
    variable.send("More text")
    // subscription2 received value: Initial text
    // subscription2 received value: More text
    
    
[/code]


CC BY-SA 4.0
2022-05-04T11:14:08.043
88650
2022-05-04T11:14:08.043
35709
88049
answer