Swift: #warning ที่เทียบเท่า


192

Swift มี #warning ที่เทียบเท่าหรือไม่ มันใช้เพื่อแสดงคำเตือนใน GUI ของ Xcode

ฉันสนใจด้วยว่ามี #error เทียบเท่า

Apple ได้กล่าวว่าเครื่องหมาย #pragma ในไม่ช้ามันอาจเป็นเช่นเดียวกันกับเรื่องนี้

ป้อนคำอธิบายรูปภาพที่นี่


7
ฉันคิดว่ามันจะ//WARNINGเหมือนกับ #pragma //MARKแต่ตอนนี้ไม่ได้เพิ่ม XCode รุ่นใดลงไป
Lord Zsolt

1
ฉันขอแนะนำให้ยื่นเรดาร์เพื่อขอ // คำเตือน
พิกเซล

@pixel ฉันเพิ่งยื่นเรดาร์
SomeGuy

คุณยอมรับคำตอบของ Jordan Smith ได้ไหม? ตอนนี้ถูกสร้างเป็น Swift เป็น #warning
Bill

คำตอบ:


158

ในอนาคตแอปเปิ้ล devs อาจปล่อย//WARNING:แลนด์มาร์กหรือให้ฟังก์ชั่นการทำงานสำหรับแลนด์มาร์คที่มีชื่ออื่น

หากต้องการประกาศใช้ฟังก์ชันนี้กับ Swift ใน Xcode วันนี้คุณสามารถทำสิ่งต่อไปนี้ตามที่อธิบายโดย Ben Dodson & Jeffrey Sambells:

เพิ่มสคริปต์เรียกใช้ใหม่ไปยังแท็บสร้างเฟสของเป้าหมายของคุณ (การตั้งค่าโครงการ> สร้างเฟส> '+'> เฟสสคริปต์เรียกใช้ใหม่) และวางรหัสต่อไปนี้ในช่องว่าง:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

สิ่งนี้จะบังคับให้ Xcode ตั้งค่าสถานะการเตือน ณ เวลารวบรวมสำหรับการใด ๆ// TODO:หรือ// FIXME:ความคิดเห็นที่คุณทำเครื่องหมาย

หรือคุณสามารถแก้ไขแท็กที่มีแท็กที่กำหนดเอง: TAGS="WARNING:"ในโค้ดข้างต้นซึ่งจะทำให้การทำงานเริ่มต้นสำหรับสิ่งที่ต้องทำและ FIXME และจะยกคำเตือนรวบรวมเวลาในการแสดงความคิดเห็นใด ๆ // WARNING:ที่ทำเครื่องหมายขึ้นเป็น

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- คำเตือนจากที่สิ่งที่ต้องทำความคิดเห็น

แก้ไข: 18/11/14

@ david-h เพิ่มจุดที่ดีในความคิดเห็นของเขา ถ้าคุณต้องการเพิ่มคำเตือนเหล่านี้ในการกำหนดค่าการสร้างเฉพาะคุณสามารถทำต่อไปนี้:

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

หรือคุณสามารถใช้ "Release" แทน "Debug" เพื่อกำหนดเป้าหมายการสร้างการผลิตเท่านั้น


นี่เป็นทางออกชั่วคราวที่ดีมากจนกระทั่ง Apple แก้ไข :)
ซื้อบางคน

ปัญหาคือแอพของฉันมีสองโหมดคือการพัฒนาและการผลิต ฉันต้องการที่จะรู้ว่ามันสร้างความสะอาดในการผลิต แต่ฉันได้รับคำเตือนในการพัฒนาที่เตือนฉันว่าฉันอยู่ในโหมด dev โดยใช้ URL ที่แตกต่างกันหมดเวลาการตั้งค่าอื่น ๆ ฯลฯ ข้อเสนอแนะของ Arie ด้านบนช่วยให้ฉันทำได้ ธงทุกอย่าง ที่กล่าวว่าเทคนิคนี้มีการใช้อย่างแน่นอนดังนั้นฉันจึงโหวตด้วย!
David H

ความคิดที่มีประโยชน์คืออะไร! ขอบคุณสำหรับการแบ่งปันข้อมูลที่เป็นประโยชน์นี้
ทอมมี่

@ kyle คุณช่วยบอกความหมายของ perl -p -e "s / ($ TAGS) / คำเตือน: \ $ 1 /" บรรทัดนี้ได้ไหม
Rocker

3
ใช้งานได้ดี แต่ฉันต้องเพิ่ม-type fตัวเลือกในfindคำสั่งเพื่อแยกไดเรกทอรีออกจากผลลัพธ์การค้นหา นี่ไม่ควรเป็นปัญหาสำหรับคนส่วนใหญ่ แต่ทุกคนที่ใช้R.swiftพ็อดจะพบข้อผิดพลาดเดียวกันกับที่ฉันมีเพราะR.swiftเป็นได
Dan F

156

แก้ไข

ตั้งแต่ Swift 4.2 การสนับสนุนระดับภาษามีให้สำหรับทั้งคำเตือนและข้อผิดพลาดของบิลด์

#warning("Warning description")
#error("Throws a build error")

คำตอบเดิม

รวดเร็วสกปรกและง่ายมากในเวลาเดียวกัน

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

ส่งสัญญาณเตือนว่าไม่เคยใช้ 'FIX_ME__🛠🛠🛠'

คุณสามารถเพิ่มอิโมติคอนให้กับชื่อตัวแปรได้หากคุณต้องการ ... ฉันมักจะใช้😱และ🛠สำหรับบางสิ่งที่จำเป็นต้องมีการแก้ไขฉันยังต้องพิจารณา💩 คุณสามารถแทนที่FIX_ME__ด้วยสิ่งที่คุณต้องการ: ALGORITHM_NEEDS_REVIEW, BugID_148หรือJOHNNY_YOU_BROKE_THISเป็นตัวอย่างบางส่วน

รวดเร็วไม่มีการตั้งค่ารัดกุมและอีโมติคอนสามารถเพิ่มอารมณ์ขัน / บุคลิกภาพในรหัสของคุณ บางครั้งทางออกที่ง่ายที่สุดคือทางออกที่ดีที่สุด


6
... ทำไมต้องโหวตทั้งหมด? วิธีนี้ใช้ได้เช่นเดียวกับวิธีอื่นใดที่นี่ หากคุณลงคะแนนเสียงอย่างน้อยก็ให้เหตุผลบางทีฉันอาจจะไม่ชัดเจนพอหรือมีบางอย่างผิดปกติกับสิ่งที่ฉันทำ ฉันชอบที่จะรู้ว่ามี
Jordan Smith

16
ใช่ฉันไม่แน่ใจว่าทำไมถึงไม่เพิ่มขึ้นอีก โซลูชันอื่นทั้งหมดนั้นซับซ้อนเกินไป
Simone Manganelli

3
@ZaEeMZaFaR คอมไพเลอร์น่าจะกำจัดมันมาก นอกจากนี้ในกรณีส่วนใหญ่ปัญหาเหล่านี้จะได้รับการแก้ไขก่อนที่จะเผยแพร่ และ - แม้ว่าจะด้วยเหตุผลใดก็ตามคอมไพเลอร์ก็ไม่ฉลาดพอที่จะกำจัดมัน (ฉันคิดว่ามันไม่น่าจะเป็นไปได้มาก) - 100 Int vars ในหน่วยความจำคือ 6.4kb ของหน่วยความจำ - โดยทั่วไปไม่มีอะไร ฉันไม่คิดว่าคุณมีจุดที่ถูกต้องขออภัย
Jordan Smith

4
ฉันใช้คนอื่น แต่เปลี่ยนไปใช้อันนี้ มันเป็นวิธีที่ง่ายที่สุดและคุณยังสามารถส่งข้อความเล็ก ๆ น้อย ๆ ที่จะปรากฏในคำเตือนได้เช่น: let fixMeMakeMeNonOptional: Intให้คุณ Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it ในตัวแก้ไขปัญหา โซลูชันอื่นทั้งหมดให้ข้อความแสดงข้อผิดพลาดทั่วไปมากขึ้น
Nathan Perry

1
@NathanPerry ใช่เห็นด้วย การตั้งค่าบางสิ่งที่ซับซ้อนไม่ได้เป็นตัวเลือกเสมอไปโดยเฉพาะอย่างยิ่งเมื่อคุณทำงานในทีมหรือในหลายโครงการเป็นต้นนอกจากนี้โซลูชันที่เรียบง่ายยังดีที่สุดเสมอ ฉันเพิ่งจะใส่ข้อความไว้ข้างในความคิดเห็น แต่สิ่งที่คุณทำไม่ได้เป็นความคิดที่ไม่ดีเช่นกัน
Jordan Smith

81

โพสต์อัพเดต WWDC 2018

เริ่มต้นด้วย Xcode 10 และ Swift 4.2 ตอนนี้คุณจะสามารถใช้งานได้#warningอีกเช่น:

#warning("TODO: Clean up this code after testing")

สิ่งนี้จะปรากฏเป็นคำเตือนใน Xcode ตามที่คาดไว้!

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

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

นอกจากนี้ยังมี#errorถ้าคุณต้องการสร้างงานของคุณล้มเหลว


คำตอบ WWDC ก่อนปี 2018

ในสวิฟท์ใช้ XCode 6 คุณสามารถใช้ที่แตกต่างกันชนิดของสถานที่สำคัญสำหรับวัตถุประสงค์ที่ต่างกัน นี่คือสิ่งที่ Apple พูดเกี่ยวกับ:

ตอนนี้ Xcode สนับสนุน // MARK :, // สิ่งที่ต้องทำ: และ // FIXME: จุดสังเกตเพื่อใส่คำอธิบายประกอบรหัสของคุณและแสดงไว้ในแถบกระโดด

ดังนั้นสำหรับการตั้งคำเตือนพร้อมคำอธิบายคุณจะใช้สิ่งนี้:

//TODO: Clean up this code after testing

หากคุณต้องการตั้งเครื่องหมายสั้น ๆ (สมมติว่าคุณจะจดจำสิ่งที่ต้องทำ) ให้ใช้สิ่งนี้:

//FIXME

แก้ไข: สถานที่สำคัญเหล่านี้จะปรากฏเฉพาะในแถบกระโดดของ XCode ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการและสิ่งที่คาดหวัง - โดยเฉพาะจากเครื่องหมาย // TODO: และ // FIXME ฉันได้ยื่นเรดาร์เกี่ยวกับเรื่องนั้น: # 17776817 หวังว่า Apple จะเพิ่มสิ่งนี้ใน build ที่กำลังจะมาใน XCode 6

แนวทางแก้ไข (แก้ไข 2): หากคุณติดตั้ง Swift Linter ผ่าน Homebrew (เรียกใช้งานbrew install swiftlintหลังจากbrew update) และเพิ่มสคริปต์บิลด์ที่แนะนำให้กับโครงการของคุณคุณจะเห็นสัญลักษณ์สถานที่TODOและFIXMEสัญลักษณ์ทั้งหมดปรากฏขึ้นภายใน Xcode SwiftLint จะเพิ่มคำเตือน / ข้อผิดพลาดเพิ่มเติมที่คุณสามารถกำหนดค่าให้เหมาะกับความต้องการของคุณได้ - ฉันสามารถแนะนำให้ใช้ SwiftLint เท่านั้นและจะแก้ปัญหานี้ได้อย่างยอดเยี่ยม!


7
น่าเสียดายที่สิ่งเหล่านี้ไม่ปรากฏในแผงคำเตือนเมื่อคุณรวบรวมแอปของคุณ ฉันยังคงรอคนที่ยื่นออกมาเหมือนนิ้วโป้งที่เจ็บคุณจึงไม่น่าจะลืมพวกเขา สิ่งเหล่านี้จะปรากฏใน jumpbar และคุณจะต้องจำไว้ว่าต้องค้นหาโครงการของคุณเพื่อหา "// TODO" เพื่อค้นหา หรือถ้าใครรู้วิธีที่จะเห็นพวกเขาสำหรับโครงการทั้งหมดให้ฉันรู้ - เวลาสำหรับ Radar ตัวอื่น :)
ซื้อ

1
เอ่อใช่คุณพูดถูก ฉันคิดว่า jump bar เป็นแถบด้านข้างทางด้านซ้ายและเครื่องหมายเหล่านั้นจะปรากฏใน Issue Navigator แต่ไม่มี ฉันเพิ่งยื่นเรดาร์ไปแล้ว: # 17776817 :)
Jeehut

@SomeGuy คุณหมายถึงอะไรที่พวกเขาแสดงใน jumpbar? จากสิ่งที่ฉันเห็นพวกเขาไม่มีที่ไหนบนแถบที่อยู่ด้านบนของหน้าต่างตัวแก้ไขใน Xcode วิธีเดียวที่จะสังเกตเห็นพวกเขา (ถึงฉัน) ดูเหมือนว่าจะค้นหาพวกเขาด้วย Command + F. สถานที่สำคัญแสดงอยู่ที่ไหน
อัลเมล

2
@almel jumpbar คือดรอปดาวน์ที่ด้านบนของไฟล์มันแสดงรายการของฟังก์ชั่นในไฟล์ปัจจุบันi.cubeupload.com/jLRwTs.png
SomeGuy

55

ยังไม่ได้เพิ่มโดยทีมงาน Apple สิ่งที่ฉันตัดสินใจที่จะทำคือการโกง แต่อย่างน้อยมันก็แสดงข้อความ FIXME ให้ฉันดู ดังนั้นสิ่งที่ฉันทำคือประกาศฟังก์ชัน FIXME () ในไฟล์ Swift:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

และเมื่อฉันเรียกมันจากฟังก์ชั่นอื่นมันจะแสดงคำเตือนเช่น

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับ Swift 2 ใช้

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")

2
เพียงบันทึก: @availability ได้รับการเปลี่ยนชื่อเป็น "@available" ใน swift 2
Tobias

42

ดูที่นี้บทความ

คุณสามารถเขียนสคริปต์ของคุณเองซึ่งจะเน้นแท็กทั้งหมด

TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"

ผลลัพธ์นี้ไปที่: ป้อนคำอธิบายรูปภาพที่นี่


เพิ่มegrep --directories='skip'เพื่อไม่สนใจไดเรกทอรีที่มีชื่อเช่นDevice.swift
chunkyguy

12

อีกทางเลือกหนึ่งถ้าคุณต้องการให้บางสิ่งปรากฏขึ้นในแผงคำเตือนคุณสามารถเขียนสิ่งต่อไปนี้

if (false){
   var x = 2;
}

คุณไม่สามารถรับข้อความใด ๆ ให้แสดงได้ แต่อย่างน้อยมันก็เป็นเครื่องหมายที่มองเห็นได้ชัดเจนกว่าโดยเฉพาะถ้าคุณมักจะปฏิบัติกับคำเตือน (ส่วนใหญ่) เช่นข้อผิดพลาด


11
หรือเพียงแค่ทำผิดถ้า {"ข้อความเตือน"}
Bao Lei

ทางออกนี้แย่มาก แต่ดูเหมือนจะเป็นสิ่งที่ดีที่สุด โหวตแล้วขอบคุณ
skagedal

6

ฉันเสนอและนำคุณสมบัตินี้ไปใช้และจะมาพร้อมกับ Swift 4.2 คุณสามารถใช้มันในขณะนี้โดยดาวน์โหลดmastertoolchain บนswift.org

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")

5

หนึ่ง CocoaPod ที่ฉันใช้อยู่นั้นมี.swiftชื่ออยู่ในนั้นดังนั้นไดเรกทอรีจึงถูกส่งกลับซึ่งทำให้ Kyle เกิดข้อผิดพลาด เพิ่ม-type fไปที่findการแก้ไขคำสั่งว่าปัญหาโดยเฉพาะการมองหาที่ไฟล์ที่ตรงกับ*.swiftแทนของไดเรกทอรียังกลับมาที่ตรงกับรูปแบบ

รหัสสุดท้ายที่ฉันใช้:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

1
มีวิธีที่จะไม่คอมไพเลอร์บ่นหรือไม่? ฉันได้รับ "Command / bin / sh emitted ข้อผิดพลาด แต่ไม่ได้ส่งคืนรหัสทางออกที่ไม่ใช่ศูนย์เพื่อระบุความล้มเหลว"
Chris Paveglio

ในฐานะที่เป็นทางเลือกดูความคิดเห็นด้านบน
chunkyguy

4

หากคุณไม่เต็มใจที่จะปรับการตั้งค่าการสร้างของคุณวิธีแก้ไขง่ายๆที่บ้านอีกอย่างหนึ่งก็คือการติดตัวยึดตำแหน่งตัวแก้ไขหน้าความคิดเห็น:

<#todo#>// stop and fixme!

คุณได้รับข้อผิดพลาด“ ตัวยึดตำแหน่งตัวแก้ไขในไฟล์ต้นฉบับ” เมื่อคุณสร้าง แต่ไม่เหมือนกับวิธีแก้ปัญหาของ Jordan ไม่มีข้อผิดพลาดที่จะรบกวนคุณขณะพิมพ์:

ตัวยึดตำแหน่งบรรณาธิการ


แนวคิดที่ดี - แต่ไม่ใช่แนวคิดที่จะส่งคำเตือนและไม่ใช่ข้อผิดพลาดใช่หรือไม่ การทำเช่นนี้จะไม่ทำให้คุณสร้างจนกว่าคุณจะลบออกซึ่งในกรณีส่วนใหญ่ (ส่วนใหญ่?) ไม่ใช่สิ่งที่คุณต้องการอย่างแน่นอน สิ่งที่ต้องทำและ FIXME เครื่องหมายบางครั้งเกี่ยวข้องกับสัปดาห์ที่ผ่านมามูลค่าของการทำงาน - ฉันคิดว่าคุณต้องการที่จะสร้างและเรียกใช้โครงการของคุณในช่วงเวลานี้ :)
จอร์แดนสมิ ธ

แน่นอนว่าเป็นจุดที่ดี วิธีการนี้มีประโยชน์สำหรับรายการที่ต้องทำเร่งด่วนที่ต้องเกิดขึ้นก่อนที่จะส่งมอบหรือแม้แต่เรียกใช้แอปพลิเคชัน ประโยชน์หลักคือการเน้นไวยากรณ์และตัวแก้ไขอื่น ๆ ยังคงทำงานต่อไปแม้จะมีตัวแทนสำรองนี้อยู่ ฉันใช้วิธีการอื่น ๆ ที่นี่ด้วยตัวเองรวมถึงของคุณ แต่ตัวยึดตำแหน่งบางครั้งก็มีประโยชน์เมื่อทำงานหลายอย่างพร้อมกัน มันเหมาะกับกรณีการใช้งานเช่นเดียวกับตัวแทรก Xcode ตัวยึดเมื่อทำการเติมการเรียกใช้ฟังก์ชันโดยอัตโนมัติ
Minh Nguyễn

3

หลังจากค้นหาและโหยหามานานมากฉันเชื่อว่าไม่มีเอนทิตีดังกล่าวอยู่ ฉันยังหวังว่าจะมีบันทึกย่อรุ่นล่าสุดของ Xcode ที่กล่าวถึงการขาดกลไก #pragma อย่างต่อเนื่อง #warning และ #error ก็อาจจะมาด้วยเช่นกัน

นอกจากนี้ฉันขอแนะนำให้ยื่น Radar กับ Apple ที่bugreport.apple.comเพื่อเพิ่มฟังก์ชั่นนี้ (คุณสามารถหลอก 17702491)


1
ฉันทำส่วนของฉัน: rdar: // 19005171
David H

1
เติมในเรดาร์ด้วย
HixField

2

เราเขียนเครื่องมือที่สามารถกำหนดค่าได้ซึ่งให้คุณใส่คำเตือนและข้อผิดพลาดใน Xcode Issue Navigator ตามแท็กความคิดเห็นและการกำหนดค่าโครงสร้าง https://github.com/doubleencore/XcodeIssueGenerator

ติดตั้ง:

brew tap doubleencore/tap
brew install xcodeissuegenerator

จากนั้นใส่บรรทัดใน Run Script Build Phase:

# Mark WARNINGs, SERIOUSs, and TODOs as warnings in DEBUG builds excluding the Vendor and Third Party directories.
XcodeIssueGenerator -b DEBUG -w "WARNING, SERIOUS, TODO" -x "Vendor/, Third Party/"

นี่คือบทความที่อธิบายวิธีที่เราใช้


2

ฉันอาจมาสายกับปาร์ตี้ด้วย Xcode 10 ที่รองรับข้อผิดพลาดและคำเตือน แต่เพียงแค่ใส่สตริง:

"Need to finish implementing this"

จะสร้างคำเตือน: String literal is unusedด้วยการเติมข้อความอัตโนมัติยังคงทำงานและโครงการยังคงรวบรวม


1

คำตอบของฉันไม่ได้ตอบสนองค่อนข้างคำถามของคุณ แต่ถ้าคุณต้องการสิ่งที่ง่ายคุณสามารถใช้นี้ปลั๊กอินของAlcatrazที่ทำงานในทุกโครงการโดยไม่ต้องเตรียมการใด ๆ เพิ่มเติม เพียงทำต่อไปนี้:

1) install Alcatraz (Nice package manager for Xcode Plug-ins) by entering this line in terminal: 
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2) Then restart Xcode and on it launch agree to install all bundles not included in Xcode
3) In Xcode select menu item -> Window -> Package manager -> type in search panel XTodo and press install
4) Relaunch Xcode and again agree to install additional bundles
5) From now press Ctrl + T and you will see all Tags in nice window

นอกจากนี้ยังมีการตั้งค่าสำหรับการเพิ่มแท็กใหม่

ป้อนคำอธิบายรูปภาพที่นี่


1

ข้อดีของตัวอย่างนี้ - มันไม่แสดงคำเตือนจากพ็อด:

if [ "${CONFIGURATION}" = "DEBUG" ]; then 
    TAGS="TODO:|FIXME:|WARNING:|warning:" find "." \( -name "*.swift" \) -not -path "./Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

ติดตั้งอย่างไร:

ป้อนคำอธิบายรูปภาพที่นี่

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