기존 객체에 확장자를 추가하는 Swift 파일의 이름을 지정하는 가장 좋은 방법은 무엇입니까?


165

언어 사양에 설명 된대로 확장을 사용하여 기존 Swift 객체 유형에 확장을 추가 할 수 있습니다 .

결과적으로 다음과 같은 확장을 만들 수 있습니다.

extension String {
    var utf8data:NSData {
        return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
    }
}

그러나 그러한 확장자를 포함하는 Swift 소스 파일에 가장 적합한 명명 방법은 무엇입니까?

과거에이 규칙은 Objective-C 안내서extendedtype+categoryname.m 에서 논의 된 것처럼 Objective-C 유형 에 사용 되었습니다 . 그러나 Swift 예제에는 범주 이름 이 없으므로 호출하는 것이 적절하지 않습니다.String.swift

질문은 위의 String확장명을 사용하면 신속한 소스 파일을 어떻게 호출해야합니까?


4
이것은 코드 검토 질문이 아닙니다.이 특정 예제에 관심이 없으며 빠른 명명 규칙이 무엇인지 알고 싶습니다.
AlBlue

2
명명 규칙이 없습니다. 우리가 계속해야 할 유일한 것은 Objective-C의 카테고리입니다.이 카테고리는 항상 ClassName+ExtensionName형식을 따르며 여전히 많은 사람들이 사용하지 않는 것을 보았습니다. 게다가 클래스와 확장명을 함께 정의하거나 파일에 더 나은 이름을 지정 FooAbleTypes하고 인스턴스를 집계하여 정의하는 대신에 그 복잡함을 발견했습니다 .
CodaFi

4
없는 네이밍 방법은 아직 없습니다. 여기에 대한 생각이 있습니다 : 모든 전역 확장을 하나로 묶습니다 Extensions.swift. 그렇게하면, 당신은 그것들을 잃지 않을 것이고 코드베이스를 처음 접하는 사람들은 즉시 그들을 알 수 있습니다. 그리고 일회용 파일 확장자를 필요한 파일에 비공개로 유지하고 싶습니다.
Andrew

1
Andrew가 말했듯이 아직 표준 명명 방법은 없습니다. 따라서이 질문은 새로 형성된 커뮤니티가 제안 된 아이디어를 얻을 수 있도록 구체적으로 의견을 구하도록 요청되었습니다.
AlBlue

1
단일 extensions.swift 파일은 내 생각에 갈 수있는 방법입니다. 내부 구조를 (자신 만의 방식으로) 체계적으로 유지하여 필요한 것을 쉽게 찾으십시오. 단일 파일은 다양한 프로젝트에서 쉽게 복사하거나 링크 할 수 있으며 잊어 버리지 않습니다.
Yohst

답변:


202

내가 본 대부분의 예제는 Objective-C 접근 방식을 모방 한 것입니다. 위의 예제 확장은 다음과 같습니다.

String+UTF8Data.swift

장점은 이름 지정 규칙이 그것이 확장이고 어떤 클래스가 확장되고 있는지 쉽게 이해할 수 있다는 것입니다.

Extensions.swift또는 사용의 문제점 StringExtensions.swift은 파일 내용을 보지 않고 파일 이름을 파일의 목적으로 유추 할 수 없다는 것입니다.

xxxable.swiftJava가 사용하는 방식을 사용 하면 메소드 만 정의하는 프로토콜 또는 확장에 적합합니다. 그러나 위의 예는 UTF8Dataable.swift문법적으로 의미가없는 속성을 정의합니다 .


1
명명 규칙에 의해 확장되고있는 것을 추론 할 수는 있지만 IHMO는 불필요한 합병증입니다. 수많은 <name> + <extention> .swift 파일 대신 각 프로젝트에 일반적으로 사용하는 단일 extensions.swift 파일을 유지합니다. 파일은 확장 된 특정 클래스를 쉽게 찾을 수 있도록 내부적으로 구성됩니다.
Yohst

18
이 답변 <name> + <extention> .swift는 Xcode 8의 Core Data에 대한 NSManagedObject 서브 클래스를 생성 할 때 Xcode가 수행하는 방식입니다. 예 : Foo + CoreDataProperties.swift.
Jerry Krinock

4
확장 프로그램이 여러 메소드를 구현하면 어떻게 되나요?
AlexVPerl

2
가능한 한 서술 적이어야합니다. 예를 들어 필터 적용을위한 다른 기능이 포함 된 이미지에 대한 확장명이 있으면 이름을 Image + Filters.swift로 지정하십시오. 확장 기능의 관련 그룹에 다른 파일을 사용하는 것이 좋습니다. 관련 항목을 함께 그룹화하지만 관련없는 항목은 별도로 유지하십시오. 인생은 좋을 것입니다.
picciano 2012

의 규칙을 사용하는 경우 ExtendedType+Functionality.swift모든 String확장명을 예를 들어 폴더 아래의 자체 하위 폴더 (예 : String또는 String Extensions) 로 정렬하는 것이 좋습니다 Extensions. 아니면 모든 확장 파일을 Extensions폴더 아래의 동일한 수준에 저장하는 것이 더 낫 습니까?
노아 와일더

8

스위프트 컨벤션은 없습니다. 간단하게 유지하십시오.

StringExtensions.swift

내가 확장하는 각 클래스마다 하나의 파일을 만듭니다. 모든 확장명에 단일 파일을 사용하면 빠르게 정글이됩니다.


8
이것은 특히 재사용 할 수없는 것 같습니다.
Keller

1
비교하자면?
Mike Taverne

3
단일 (또는 명시 적으로 관련있는) 목적을 제공하는 클래스 확장의 단일 (또는 밀접하게 결합 된) 파일과 비교하십시오. "StringExtensions"와 같은 것은 일반적인 목적의 문자열 삭제부터 앱 특정 로직에 이르기까지 모든 것을 포함 할 수있는 것처럼 들립니다. 재사용이 문제가 될 경우 최선의 방법은 아닙니다. 코코아 명명 규칙은 구현보다는 기능에 의존합니다. "StringExtensions"가 후자를 나타냅니다. 명명 규칙을 제외하고는 분명히 ObjC에서 허용되는 대답을 선호하지만 Swift에서는 모듈로 인해 더 나은 접근 방식으로 보입니다.
Keller

2
말이 되네요 재사용이 중요하지 않은 단일 앱에 대해 더 많이 생각하고있었습니다. 예를 들어, 확장으로 사용하려는 관련이없는 문자열 함수가 몇 개 있다고 가정하면 하나의 파일을 만들어이 함수를 모두 넣거나 함수 당 하나의 파일을 만들 수 있습니다. 이 경우 단일 파일의 단순함이 마음에 듭니다. 그러나 당신의 추론은 건전합니다. 감사.
Mike Taverne

여기에 추가 된 것은 모든 문자열에 자연스럽게 적용 됩니다 (예 : 'trimRight ()'). 좀 더 유스 케이스에 특정한 것이라면 (예 : 'formatAccountNumber ()'), 파일은 'Strings + AccountFormatting.swift'이어야하며 실제로는 파일을 어지럽히 지 않도록 사용되는 곳으로 만 범위를 지정해야합니다. 다른 곳에서 '문자열'표면 API.
Mark A. Donohoe

1

내가 좋아 StringExtensions.swift내가 좋아하는 무언가로 파일을 분할 너무 많은 일을 추가 할 때까지 String+utf8Data.swift하고 String+Encrypt.swift.

한 가지 더, 비슷한 파일을 하나로 결합하면 건물이 더 빨라집니다. 신속한 빌드 시간 최적화를 참조하십시오.


1
같은 것에 대해 두 가지 파일 명명 규칙이 있습니다. 나는 그것이 나쁜 생각합니다.
의미 문제

@ meaning- 물질 중요합니다. 두 가지 명명 규칙은 Apple 문서에서 잘 알려져 있고 권장됩니다. 당신이 원하는대로하십시오.
DawnSong

더 많은 프로그래머들이 네이밍 및 코드 [포맷] 변형을 제한하여 우아함을 위해 노력하기를 바랍니다.
의미 문제

@ meaning-matters Elegance에는 두 가지 측면이 있습니다. C와 같은 언어로 중괄호를 쓰는 방법에 대한 고전적인 논란이되는 문제와 같습니다. 사소한 일이므로 대부분의 사람들이 동의 할 때까지 하나를 선택하여 필수로 만들 필요는 없다고 생각합니다.
DawnSong

나는 확장의 이름을 지정하는 한 가지 방법 또는 중괄호를 배치하는 한 가지 방법을 사용하여 일관성의 우아함을 의미했습니다. 그런 다음 다른 중괄호 스타일의 가독성에 상당한 차이가 있다고 생각합니다. 그래서 나는 그것이 '사소한'것이라고 생각하지 않습니다.
의미 문제

0

팀이 합의한 공통 및 기타 개선 사항이있는 경우 Extensions.swift를 함께 묶으면 간단한 첫 번째 수준의 솔루션으로 작동합니다. 그러나 복잡성이 커지거나 확장이 더 복잡해지면 복잡성을 캡슐화하기위한 계층 구조가 필요합니다. 그러한 상황에서는 다음과 같은 사례를 예로들 것을 권장합니다.

나는 백엔드와 대화하는 수업을했습니다 Server. 두 개의 다른 대상 앱을 포함하기 위해 더 커지기 시작했습니다. 어떤 사람들은 큰 파일을 좋아하지만 확장명으로 논리적으로 분리됩니다. 선호하는 것은 각 파일을 비교적 짧게 유지하는 것이므로 다음 솔루션을 선택했습니다. Server원래 CloudAdapterProtocol모든 방법을 준수 하고 구현했습니다. 내가 한 것은 하위 프로토콜을 참조하여 프로토콜을 계층 구조로 바꾸는 것입니다.

protocol CloudAdapterProtocol: ReggyCloudProtocol, ProReggyCloudProtocol {
    var server: CloudServer {
        get set
    }
    func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void)
}

에서 Server.swift내가 가진

import Foundation
import UIKit
import Alamofire
import AlamofireImage

class Server: CloudAdapterProtocol {
.
.
func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void) {
.
.
}

Server.swift그런 다음 서버를 설정하고 API 버전을 얻기 위해 핵심 서버 API를 구현합니다. 실제 작업은 두 개의 파일로 나뉩니다.

Server_ReggyCloudProtocol.swift
Server_ProReggyCloudProtocol.swift

이들은 각각의 프로토콜을 구현합니다.

그것은 다른 파일 (이 예제에서는 Alamofire의 경우)에 가져 오기 선언이 필요하지만 내 관점에서 인터페이스를 분리하는 관점에서 깨끗한 솔루션을 가져야한다는 것을 의미합니다.

이 접근법은 외부에서 지정한 클래스뿐만 아니라 자신의 클래스와 똑같이 잘 작동한다고 생각합니다.


0

이것이 왜 논쟁인가? 모든 하위 클래스를 _Subclasses.swift라는 파일에 넣어야합니다. 나는 그렇게 생각하지 않는다. 스위프트는 모듈 기반 이름 간격을 가지고 있습니다. 잘 알려진 Swift 클래스를 확장하려면 용도에 맞는 파일이 필요합니다. UIViewExtensions.swift 파일을 작성하여 목적을 나타내지 않으며 개발자를 혼란스럽게 만들고 빌드하지 않는 프로젝트에서 쉽게 복제 할 수있는 큰 팀을 만들 수 있습니다. Objective-C 이름 지정 규칙은 제대로 작동하며 Swift가 실제 이름 간격을 가질 때까지 가장 좋은 방법입니다.


필자의 경우, 해당 파일에 정의 된 확장명이 'placeIn (UIView)'메서드와 같은 모든 / 모든 UIView 클래스에 적합하다면 UIViewExtensions.swift라는 파일을 갖는 것이 가장 합리적이라고 생각합니다. 용도에 따라 다르면 (예 : 앱의 일부에 대해서만 사용자 정의보기 장식을 사용하는 경우) UIView + CustomDecoration.swift를 사용합니다 .'UIViewExtensions라는 파일을 말하는 것처럼 일반화하기 전에 사용법을 고려해야합니다. .swift는 목적이 모든 UIView에 대한 일반적인 확장 일 때 목적을 나타내지 않습니다 '
Mark A. Donohoe

0

장소에 내 의견을 추가하는 것이 아니라 하나의 답변으로 여기에 의견을 제시하고 있습니다.

개인적으로, 나는 확장하고있는 객체의 API 표면 영역을 어지럽히 지 않으면 서 좋은 유용성과 명확성을 제공하는 하이브리드 접근 방식을 취합니다.

예를 들어 있다는 것을 차종은 감각 에 사용할 수 있는 갈 것이다 문자열 StringExtensions.swift과 같은 trimRight()removeBlankLines().

내가 같은 확장 기능이 있다면 그러나, formatAsAccountNumber()그것은 것입니다 하지 '계좌 번호'가 자연스럽게 하나에 적용 무언가가 아니기 때문에 해당 파일의 이동을 / 모든 문자열과는 계정의 맥락에서 의미가 있습니다. 이 경우, 나는라는 파일을 만들 것 Strings+AccountFormatting.swift조차 어쩌면 또는 Strings+CustomFormatting.swift로모그래퍼 formatAsAccountNumber()실제로 포맷하기 위해 여러 종류 / 방법이있는 경우 기능.

실제로, 마지막 예에서, 나는 팀이 처음에 이와 같은 확장을 사용하지 않도록 적극적으로 설득하고 대신 API 표면 영역에 전혀 AccountNumberFormatter.format(String)닿지 않아야 하는 것과 같은 것을 권장 String합니다. 확장자가 사용 된 파일과 동일한 파일에 해당 확장자를 정의한 경우에는 자체 파일 이름이없는 경우는 예외입니다.


0

+확장명이 포함되어 있다는 사실에 밑줄을 긋는 것을 선호 합니다.

String+Extensions.swift

파일이 너무 커지면 각 목적에 맞게 분할 할 수 있습니다.

String+UTF8Data.swift

String+Encrypt.swift

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.