objektif-c - RAC: penghantaran jenis penunjuk blok tidak serasi
过去多啦不再A梦
过去多啦不再A梦 2017-05-02 09:34:46
0
1
1430

ps: Saya menggunakan 'ReactiveObjC' ~> '2.1.0'
Selepas menukar parameter langgananSebelah UIColor, saya mendapat ralat "jenis penunjuk blok tidak serasi menghantar 'void(^)(UIColor __strong)' kepada parameter jenis'void(^_Nonnull)(NSString _Nullable __strong)'"

// 默认
[[self.searchText.rac_textSignal map:^id(NSString *text) {
    return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}]
subscribeNext:^(NSString * _Nullable x) {
     
}];
// 方法1 将subscribeNext中的类型修改为UIColor类型
[[self.searchText.rac_textSignal map:^id(NSString *text) {
    return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}] subscribeNext:^(UIColor *color) {
    
}];

Tetapi apabila saya menggunakan pembolehubah sementara validSearchTextSignal untuk menyimpan isyarat dan kemudian melangganSeterusnya, ia berfungsi, seperti yang ditunjukkan di bawah, kompilasi berlalu dan berjalan seperti biasa

// 方法2
RACSignal *validSearchTextSignal = [self.searchText.rac_textSignal map:^id(NSString *text) {
    return [self isValidSearchText:text] ? [UIColor clearColor] : [UIColor yellowColor];
}];
[validSearchTextSignal subscribeNext:^(UIColor *color) {
    self.searchText.backgroundColor = color;
}];

Malah, kaedah pengubahsuaian adalah sangat mudah Selain kaedah di atas, anda juga boleh melakukan penukaran jenis pada pembolehubah NSString dalam Blok subscribeNext. Tetapi saya ingin tahu tentang perbezaan antara kaedah 1 dan kaedah 2. Mengapa kaedah 2 boleh dilaksanakan, tetapi kaedah 1 tidak boleh disusun.
Saya menyemak pengisytiharan kaedah ini dan jenis runcing ialah jenis id, tetapi mengapa pengkompil menggesa jenis NSString dalam senario kaedah 1. Dalam senario kaedah 2, gesaan ialah jenis id. Berikut ialah pengisytiharan kaedah Jenis paparan ialah jenis id, dan tiada pengisytiharan kaedah bagi jenis NSString ditemui

- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
    NSCParameterAssert(nextBlock != NULL);
    
    RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
    return [self subscribe:o];
}

Maklumat tambahan:
Terdapat soalan yang sama mengenai stackoverflow RACSignal: Mengendalikan jenis penunjuk blok yang tidak serasi, satu jawapan ialah "Punca ralat adalah kerana blok subscribeNext mengembalikan terbatal dan dengan meletakkan pulangan akan menghasilkan ketidakserasian dengan tandatangan blok.” Saya masih tidak faham kenapa

过去多啦不再A梦
过去多啦不再A梦

membalas semua(1)
習慣沉默

Saya sedang menggunakan versi 2.5, yang agak stabil, saya cuba memasang versi 2.1, tetapi setiap kali saya memasang versi 2.1.8, jadi saya tidak dapat melihat kod sumber tertentu. ia lebih mudah

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan