วิธีปิดเสียงเตือนอย่างรวดเร็ว


104

ฉันมีโค้ดที่สร้างคำเตือนมากมาย (เลิกใช้ API)

ใช้เสียงดัง * ฉันทำได้

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

อย่างไรก็ตามสิ่งนี้ไม่ได้ผลอย่างรวดเร็ว

จะทำอย่างไรให้รวดเร็ว?

หมายเหตุ: ฉันไม่ต้องการปิดการใช้งานคำเตือนทั่วโลกหรือแม้แต่ไฟล์ที่กว้าง แต่เพียงปิดการใช้งานคำเตือนเฉพาะในส่วนเฉพาะของซอร์สโค้ดของฉัน

แก้ไข: ฉันดูเหมือนว่าบันทึกย่อของฉันไม่ชัดเจนพอ: ฉันไม่ต้องการการรวบรวมแบบมีเงื่อนไข (ซึ่งเป็นคำตอบที่เสนอสำหรับรายการที่ซ้ำกัน) ฉันแค่ต้องการปิดเสียงเตือนโดยไม่ต้องใช้ API ใหม่



4
นี่ไม่ใช่รายการที่ซ้ำกัน คำถามอื่นไม่สามารถตอบปัญหานี้ได้
Claus Jørgensen

@ ClausJørgensenในทางใดที่ไม่สามารถตอบปัญหานี้? ไม่มีวิธีอื่นใดตามที่ระบุไว้ในคำตอบในคำถามที่เชื่อมโยง เพียงการคอมไพล์ตามเงื่อนไขหรือ#availableมาโครใหม่ที่นักพัฒนาควรใช้วิธีการใหม่และทางเลือกกลับไปใช้แบบเก่าหากไม่มีวิธีใหม่
zrzka

@robertvojta ไม่ในความเป็นจริงคำตอบไม่ได้ระบุว่าไม่มีวิธีอื่นใดในการปิดเสียงเตือน
Claus Jørgensen

2
นี่ไม่ใช่การหลอกลวง แล้วสถานการณ์ที่คุณได้รับคำเตือนว่าไม่มีผู้เริ่มต้นล่ะ?
NSTJ

คำตอบ:


169

ในปี 2020 Xcode 12.0 ฉันทามติคือไม่มีทางบรรลุเป้าหมายนั้นได้

ฉันจะอัปเดต / แก้ไขคำตอบนี้หาก Apple เพิ่มคุณสมบัตินี้

ใส่ไว้ในรายการสินค้าที่ต้องการสำหรับ WWDC 2021!


23
ไอ้นั่นเป็นคนเกียจคร้าน จะได้รับ outta มือบางครั้ง มันน่ารำคาญที่จะพูดน้อยที่สุด
Isuru

3
ฉันต้องการโหวตคำตอบนี้เป็นล้านครั้ง แต่มันตอบคำถามได้ดีเลย +1 :-)
deadbeef

3
@ อิซุรุ ณ จุดนั้นฉันรู้สึกหงุดหงิดมากพอที่จะสร้างใหม่ทั้งหมด เดาคำเตือนได้ผล
ไซเรน

1
@Isuru ส่วนใหญ่ควรได้รับการแก้ไขไม่เพิกเฉย
kevin

3
น่าหงุดหงิดจัง! ขอขอบคุณที่อัปเดตคำตอบนี้
Dan Loewenherz

51

ไม่มีโครงสร้างทั่วไปที่จะเงียบคำเตือนเลิกใช้ในสวิฟท์เป็น แต่มีวิธีแก้ปัญหาที่สามารถนำมาใช้ในหลายกรณี

สมมติว่าคุณมีเมธอดgetLatestImage()ในคลาสFooที่ใช้เมธอด / คลาสที่เลิกใช้แล้ว

ใช้@availableตามที่ Daniel Thorpe อธิบายเพื่อปิดปากคำเตือนทั้งหมดในวิธีการ:

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

ตอนนี้คุณต้องการเรียกใช้เมธอดgetLatestImage()โดยไม่ต้องมีคำเตือนการเลิกใช้งาน คุณสามารถบรรลุเป้าหมายนั้นได้โดยการกำหนดโปรโตคอลและส่วนขยายก่อน:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

จากนั้นเรียกใช้เมธอดโดยไม่มีคำเตือนการเลิกใช้งาน (ถ้าfooเป็นอินสแตนซ์ของFoo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

ผลลัพธ์ก็คือคุณมีโค้ด Swift ที่ใช้ API ที่เลิกใช้งานโดยไม่มีคำเตือนการเลิกใช้งาน


ฉลาดมาก. ชนิดของความชั่วร้าย? :) แต่ดีมาก เหมาะสำหรับกรณีการใช้งานเช่นการระงับคำเตือนเกี่ยวกับการใช้งานบางประการของกรอบงาน AddressBook ที่เลิกใช้งานไปแล้ว แต่การเปลี่ยนทดแทนยังไม่ได้ให้ฟังก์ชันที่จำเป็นทั้งหมด ขอบคุณ.
Duncan Babbage

4
ถ้าได้ผลฉันจะส่งเครื่องดื่มที่คุณชอบไปหกแพ็ค คุณมีจิตใจที่โดดเด่นขอบคุณ
จอห์น

@ จอห์นขอบคุณสำหรับคำพูดที่ดี! มันได้ผลฉันต้องคิดมันขึ้นมาในขณะที่เราถือว่าคำเตือนเป็นข้อผิดพลาดใน codebase ของเราและมีส่วนหนึ่งที่ยังคงใช้ไลบรารีที่เลิกใช้แล้ว
Tammo Freese

1
@ คุณจอห์นส่งซิกซ์แพ็กให้เขาหรือเปล่า? : P นี่มันสุดยอดมาก อัจฉริยะ. ขอบคุณ.
Baran Emre

คุณเป็นอัจฉริยะที่ชั่วร้าย
Krypt

40

จริงๆแล้วคุณสามารถระงับคำเตือนเหล่านี้ได้โดยใช้@availableในโครงสร้างตรรกะที่แนบมา (เช่นฟังก์ชัน / ประเภท)

ตัวอย่างเช่นสมมติว่าคุณมีโค้ดบางอย่างที่ใช้กรอบงาน AddressBook แต่คุณกำลังสร้างโดยต่อต้าน iOS 9

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

ตั้งแต่ Xcode 7.0.1 จะป้องกันไม่ให้แสดงคำเตือนแบบอินไลน์


6
ใช่ แต่คุณจะเห็นคำเตือนเดียวกันเมื่อคุณเรียกคุณaddressBookStatus()ว่า ... คุณทำเครื่องหมายว่าเลิกใช้แล้ว
Valentin Shergin

4
เคล็ดลับมือโปร: ถ้าคุณต้องการที่จะเงียบมันสำหรับทั้งชั้นเพียงแค่สแลลูกสุนัขนี้ขึ้นเหนือระดับคำสั่งของคุณ (เช่นclass ViewController: UIViewController)
ไซเรน

2
@ ไซเรนคุณจะเห็นคำเตือนนี้ทุกครั้งที่เรียกคลาสนี้☹️ (อย่างน้อยก็มี Xcode 8)
Alexander Vasenin

มีใครปิดคำเตือนที่เลิกใช้แล้วทั้งหมดด้วยการแก้ไขนี้หรือไม่ ฉันสามารถลดจำนวนลงเหลือเพียงตัวเดียวแต่ฉันไม่เห็นวิธีที่จะกำจัดคนสุดท้าย ข้อเสนอแนะใด ๆ ?
Alexander Vasenin

1
ดังนั้นวิธีที่ใช้นี้จะเงียบเตือน“โยนจาก 'CGFloat.NativeType' (aka 'คู่') ประเภทที่ไม่เกี่ยวข้อง 'ลอย' มักจะล้มเหลว”เมื่อฉันทำif CGFloat(0).native is Float { … }? คำตอบ: ฉันไม่ใช้สิ่งนี้เพราะคุณไม่ได้ตอบคำถาม
Slipp D.Thompson

1

แม้ว่าตอนนี้จะไม่มีวิธีปิดคำเตือนการเลิกใช้งานใน Swift แต่ในทางเทคนิคแล้วคุณสามารถทำเช่นนั้นสำหรับสัญลักษณ์เฉพาะได้โดยแก้ไขไฟล์ส่วนหัว

  • คัดลอกชื่อสัญลักษณ์ที่เลิกใช้แล้ว
  • เลือกFile>Open Quickly
  • วางสัญลักษณ์แล้วกด Enter

    ตรวจสอบให้แน่ใจว่าไอคอน Swift ถูกปิดใช้งานในกล่อง Open Quickly

  • เลือกFile>Show in Finder

  • เปลี่ยนสิทธิ์ของไฟล์เพื่ออนุญาตการแก้ไขหากจำเป็น
  • แก้ไขมาโครการเลิกใช้งานสำหรับสัญลักษณ์ ดู API รอบ ๆ สำหรับการอ้างอิง เช่นแทนที่:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

ด้วย

__OSX_AVAILABLE_STARTING (__ MAC_10_6, __IPHONE_3_0)

ตอนนี้มีคำเตือนที่ทำให้เสียสมาธิน้อยกว่าที่คุณทำอะไรไม่ได้

ฉันรู้ว่ามันสกปรก แต่ถ้าไม่มี API ทดแทนใน SDK ปัจจุบันก็น่าจะปลอดภัย เมื่อ Xcode เวอร์ชันใหม่ออกมาการเปลี่ยนแปลงจะถูกเขียนทับและคุณจะเห็นคำเตือนอีกครั้ง จากนั้นคุณสามารถทดสอบ SDK และ OS ใหม่เพื่อให้แน่ใจว่า API ที่เลิกใช้งานยังคงใช้งานได้และไม่ได้รับการเปลี่ยนทดแทน

โปรดแสดงความคิดเห็นหากคุณสามารถพบข้อเสียใด ๆ


การลงคะแนนเสียงเพื่อความมั่งคั่ง แต่มันจะทำให้รสชาติสกปรกในปากของฉัน: P
Matt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.