سؤال

ولدي كائن (أ UIViewController) التي قد تكون أو لا تتوافق مع بروتوكول لقد محددة.

وأعرف أنني أستطيع أن تحديد ما إذا كان الكائن يتوافق مع البروتوكول، ثم استدعاء بأمان الأسلوب:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}

ولكن، كسكودي يظهر تحذير:

warning 'UIViewController' may not respond to '-protocolMethod'

ما هي الطريقة الصحيحة لمنع هذا التحذير؟ أنا لا يمكن أن يبدو للادلاء self.myViewController كطبقة MyProtocol.

هل كانت مفيدة؟

المحلول

والطريقة الصحيحة للقيام بذلك هي القيام به:

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}

ووUIViewController <MyProtocol> * نوع الصب يترجم إلى "هو كائن UIViewController الذي يتوافق مع MyProtocol الرأسمالي"، في حين باستخدام id <MyProtocol> يترجم إلى "الرأسمالي هو كائن من فئة مجهولة الذي يتوافق مع MyProtocol".

وهذه الطريقة سوف مترجم تعطيك نوع التحقق السليم على vc - المترجم سوف اعطيكم فقط تحذير إذا كان يتم استدعاء أي أسلوب هذا ما لم يعلن على أي UIViewController أو <MyProtocol>. وينبغي أن تستخدم id فقط في حالة إذا كنت لا تعرف الطبقة / نوع الكائن يجري المدلى بها.

نصائح أخرى

ويمكنك يلقي مثل هذا:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}

وألقى هذا لي قليلا، أيضا. في الهدف C، والبروتوكول هو ليس من النوع نفسه، لذلك تحتاج إلى تحديد id (أو أي نوع آخر، مثل NSObject) جنبا إلى جنب مع البروتوكول الذي تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top