스위프트 : #warning equivalent


192

Swift에 #warning에 해당하는 것이 있습니까? Xcode 자체 GUI에 경고를 표시하는 데 사용됩니다.

또한 #error equivalent이 있는지에 관심이 있습니다.

애플은 #pragma 마크가 곧 나올 것이라고 말했다.

여기에 이미지 설명을 입력하십시오


7
나는 그것이 //WARNING#pragma와 같을 것이라고 가정 //MARK하지만 현재 어느 것도 XCode 베타에 추가되지 않습니다.
로드 Zsolt

1
// WARNING
pixel

@pixel 방금 레이더를 제출했습니다
SomeGuy

조던 스미스의 대답을 받아 들일 수 있습니까? 이것은 이제 #warning
Bill

답변:


158

앞으로 Apple 개발자는 //WARNING:랜드 마크를 잘 출시 하거나 다른 랜드 마크에 대한 기능을 제공 할 수 있습니다.

그러나 오늘 Xcode에서 Swift를 사용하여이 기능을 사용하려면 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:"위의 코드에서 TODO & FIXME의 기본 동작을 유지하고로 표시된 주석에 대해 컴파일 시간 경고를 발생 시키는 사용자 정의 태그를 사용하여 TAGS를 수정할 수 있습니다 // 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

또는 "Debug"대신 "Release"를 사용하여 프로덕션 빌드 만 대상으로 지정할 수 있습니다.


이것은 애플이
고칠

이 문제는 내 앱에 개발 및 프로덕션의 두 가지 모드가 있다는 것입니다. 프로덕션 환경에서 깔끔하게 빌드된다는 것을 알고 싶지만 개발 중에는 다른 URL, 시간 초과, 기타 설정 등을 사용하여 필자가 개발 모드임을 상기시키는 경고 메시지가 나타납니다. 모든 것을 표시합니다. 즉,이 기술은 확실히 사용되므로 투표도했습니다!
David H

정말 유용한 아이디어입니다! 이 유용한 정보를 공유해 주셔서 감사합니다.
Tommy

@kyle perl -p -e "s / ($ TAGS) / warning : \ $ 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 컴파일러는 아마도 그것을 제거 할 것입니다. 게다가 대부분의 경우 이러한 문제는 출시 전에 수정 될 것입니다. 그리고-어떤 이유로 든 컴파일러는 그것을 제거 할만 큼 똑똑하지 않습니다. 나는 당신이 유효한 요점을 미안하다고 생각하지 않습니다.
조던 스미스

4
나는 다른 것들을 사용했지만이 것을 사용하도록 전환했습니다. 가장 간단하며 경고에 표시되는 작은 메시지를 스스로에게 줄 수도 있습니다. 즉 , 문제 탐색기에서 let fixMeMakeMeNonOptional: Int제공합니다 Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it. 다른 모든 솔루션은 훨씬 일반적인 오류 메시지를 제공합니다.
나단 페리

1
@NathanPerry 네, 동의했습니다. 특히 팀이나 여러 프로젝트에서 작업 할 때 복잡한 것을 설정하는 것이 항상 옵션은 아닙니다. 또한 간단한 솔루션이 항상 최고입니다. 현재 의견 옆에 메시지를 넣었지만 당신이하는 일은 나쁜 생각이 아닙니다.
조던 스미스

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을 사용하는 Swift에서는 다음을 사용할 수 있습니다. 다른 목적으로 다른 종류의 랜드 마크를 . Apple이 이에 대해 말한 내용은 다음과 같습니다.

Xcode는 이제 // MARK :, // TODO : 및 // FIXME를 지원합니다. 랜드 마크 를 지원하여 코드에 주석을 달고 점프 막대에 나열합니다.

설명과 함께 경고를 설정하려면 다음과 같이 사용하십시오.

//TODO: Clean up this code after testing

짧은 마크를 설정하려면 (무엇을해야하는지 기억한다고 가정) 다음을 사용하십시오.

//FIXME

편집하다: 그러나이 랜드 마크는 XCode의 점프 막대에만 나타나며, 이는 원하는 // TODO : 및 // FIXME 마크에서 기대하지 않을 수도 있습니다. # 17776817에 레이더를 제출했습니다. Apple이 XCode 6의 다음 빌드에 이것을 추가하기를 바랍니다.

솔루션 (EDIT 2) : 당신이 브루 통해 스위프트 린터를 설치하는 경우 (실행 brew install swiftlintbrew update) 및 추가 제안 된 빌드 스크립트를 다음의 모든 볼, 프로젝트에 TODOFIXME랜드 마크 엑스 코드 내에서 경고로 나타납니다. SwiftLint는 필요에 맞게 구성 할 수있는 경고 / 오류를 더 추가 할 것입니다. SwiftLint 만 사용하는 것이 좋으며이 문제를 효과적으로 해결합니다!


7
불행히도 앱을 컴파일 할 때 경고 패널에 표시되지 않습니다. 나는 여전히 아픈 엄지 손가락처럼 튀어 나와있는 것을 기다리고 있으므로 잊어 버리지 않을 것입니다. 이것들은 점프 바에 나타나고 프로젝트를 찾기 위해 프로젝트에서 "// TODO"를 검색해야한다는 것을 기억해야합니다. 또는 전체 프로젝트에서 그들을 보는 방법을 아는 사람이 있으면 알려주십시오. -다른 레이더 시간 :)
SomeGuy

1
네 맞아요 나는 점프 바가 왼쪽의 사이드 바라고 생각했고 그 마크는 이슈 네비게이터에 나타날 것이라고 생각했지만 그렇지 않습니다. 방금 레이더를 제출했습니다 : # 17776817. :)
Jeehut

@SomeGuy 점프 바에 표시되는 것은 무엇을 의미합니까? 내가 볼 수 있듯이 Xcode의 편집기 창 상단에있는 막대의 어디에도 없습니다. 그것들을 (나에게) 알 수있는 유일한 방법은 Command + F로 검색하는 것 같습니다. 랜드 마크는 어디에 표시됩니까?
almel

2
@almel 점프 바는 파일의 상단에있는 드롭 다운으로, 현재 파일의 기능 목록을 제공합니다. i.cubeupload.com/jLRwTs.png
SomeGuy

55

아직 Apple 팀에서 추가하지 않았습니다. 내가하기로 결정한 것은 아마도 부정 행위이지만 적어도 FIXME 메시지를 보여줍니다. 그래서 내가하는 일은 Swift 파일에 FIXME () 함수를 선언하는 것입니다.

@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
}

여기에 이미지 설명을 입력하십시오

스위프트 2 사용

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

2
@availability는 빠른 2에서 "@available"로 이름이 바뀌 었습니다.
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

나는 제안구현 이 기능을, 그리고 스위프트 4.2와 함께 제공됩니다. swift.org 에서 master툴체인을 다운로드하여 지금 사용할 수 있습니다 .

#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
컴파일러가 불만을 제기하지 않는 방법이 있습니까? "명령 / bin / sh에서 오류가 발생했지만 실패를 나타 내기 위해 0이 아닌 종료 코드를 반환하지 않았습니다"
Chris Paveglio

대안으로 위의 주석을
chunkyguy

4

빌드 설정을 조정하는 것을 싫어한다면 간단한 또 ​​다른 가정 해결책은 주석 앞에 편집기 자리 표시자를 붙이는 것입니다.

<#todo#>// stop and fixme!

빌드 할 때 "소스 파일의 편집자 자리 표시 자"오류가 발생하지만 Jordan의 솔루션과 달리 입력하는 동안 성가신 라이브 오류는 없습니다.

편집자 자리 표시 자


좋은 생각입니다. 그러나 오류가 아니라 경고를 던지는 아이디어가 아닙니까? 이렇게하면 제거 할 때까지 빌드 할 수 없으며 대부분의 경우 대부분 원하는 경우가 아닙니다. Todo와 fixme 마크는 때로는 몇 주 분량의 작업을 필요로합니다.이 시간 동안 프로젝트를 빌드하고 실행하고 싶을 것입니다. :)
Jordan Smith

물론 좋은 지적입니다. 이 방법은 응용 프로그램을 커밋하거나 실행하기 전에 수행해야하는보다 긴급한 작업 항목에만 유용합니다. 주요 이점은이 자리 표시자가 있어도 구문 강조 및 기타 편집기 기능이 계속 작동한다는 것입니다. 나는 당신을 포함하여 여기에 다른 접근법 중 일부를 사용하지만 자리 표시자는 때로는 멀티 태스킹에 도움이됩니다. 함수 호출을 자동 완성 할 때 Xcode가 삽입하는 자리 표시 자와 동일한 사용 사례에 적합합니다.
Minh Nguyễn

3

많은 검색과 갈망을 한 후, 나는 그러한 존재가 존재하지 않는다고 확신합니다. #pragma 마크 메커니즘의 지속적인 부족에 대해 언급 한 최신 Xcode 릴리스 노트, #warning 및 #error도 계속 제공되기를 바랍니다.

따로, bugreport.apple.com 에서 Apple에 레이더를 제출 하여이 기능을 추가 하는 것이 좋습니다 (17702491을 제거 할 수 있음).


1
나는 내 역할을 수행했다 : rdar : // 19005171
David H

1
또한 레이더 가득
HixField

2

주석 태그 및 빌드 구성을 기반으로 Xcode Issue Navigator에 경고 및 오류를 넣을 수있는 구성 가능한 도구를 작성했습니다. https://github.com/doubleencore/XcodeIssueGenerator

설치하십시오 :

brew tap doubleencore/tap
brew install xcodeissuegenerator

그런 다음 스크립트 실행 빌드 단계에 줄을 입력하십시오.

# 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

내 대답은 아주 귀하의 질문에 만족하지 않고, 당신이 뭔가를 원한다면 쉽게 사용할 수 있습니다 의 플러그인 알카트라즈 추가 준비없이 모든 프로젝트에서 작동합니다. 다음을 수행하십시오.

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.