Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[Swift] New access modifier: package ๋ณธ๋ฌธ

apple/๐Ÿ“š Apple Docs & iOS & Swift

[Swift] New access modifier: package

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2024. 4. 5. 02:14

New access modifier: package

Introduction

  • ํ˜„์žฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํŠน์ • ์‹ฌ๋ณผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” public์œผ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•จ.
  • public ํŒจํ‚ค์ง€ ๋‚ด์™ธ๋ถ€ ๋ชจ๋‘์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Œ.
  • ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ๋งŒ๋“ค์–ด ์‹ฌ๋ณผ์˜ ๋ฒ”์œ„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ ์ž ํ•จ.
  • Swift 5.9์—์„œ ๋„์ž…

Motivation

  • Module Engine in gamePkg:
public struct MainEngine {
    public init() { ...  }
    // `public`์œผ๋กœ ์˜๋„๋œ ํ”„๋กœํผํ‹ฐ
    public var stats: String { ...  }
    // ๋™์ผํ•œ ํŒจํ‚ค์ง€์˜ `Game`์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” `run` ํ•จ์ˆ˜
    public func run() { ...  }
}
  • Module Game in gamePkg:
import Engine

public func play() {
    MainEngine().run() // ๋™์ผํ•œ ํŒจํ‚ค์ง€ ๋‚ด์— ์žˆ์œผ๋ฏ€๋กœ ์˜๋„ํ•œ ๋Œ€๋กœ 'run'์— ์ ‘๊ทผํ•  ์ˆ˜์žˆ์Œ
}
  • Client App in appPkg:
import Game
import Engine

let engine = MainEngine()
engine.run() // ์˜๋„ํ•œ ๋™์ž‘์ด ์•„๋‹ˆ๋”๋ผ๋„ ์•ฑ์—์„œ `run`์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.
Game.play()
print(engine.stats) // ์˜๋„ํ•œ๋Œ€๋กœ `stats`์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

 

Proposed solution

  • ๋™์ผ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ์ œ์–ด์ž package ๋„์ž…


Detailed design

package var package: String {...}

 

  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐœ์„  ๊ฐ€๋Šฅ
public struct MainEngine {
    public init() { ...  }
    public var stats: String { ...  }
    package func run() { ...  }
}

 

Use Site

import Engine

public func play() {
    MainEngine().run() // ๋™์ผ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ์—ฌ์ „ํžˆ ํ•ด๋‹น ์‹ฌ๋ณผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ
}

 

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ํŒจํ‚ค์ง€ ์™ธ๋ถ€์—์„œ package๋กœ ์„ ์–ธ๋œ ์‹ฌ๋ณผ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ.

 

Client App

import Game
import Engine

let engine = MainEngine()
engine.run() // Error: cannot find `run` in scope

 

Package Names

  • ์ƒˆ๋กœ์šด package ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ํ•ด๋‹น ํƒ€๊ฒŸ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด false ์ž‘์„ฑํ•˜๋ฉด ๋˜๋ฉฐ, ํ•ด๋‹น ๋ชจ๋“ˆ์— ํฌํ•จ๋œ package ์ ‘๊ทผ์ œ์–ด์ž๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ. ๊ธฐ๋ณธ์€ true
  • ์•„๋ž˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…์ž๋ฉด Game ๋ชจ๋“ˆ์—์„œ Engine๋ชจ๋“ˆ์— ํฌํ•จ๋œ package ์ ‘๊ทผ์ œ์–ด์ž ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ.
  .target(name: "Game", dependencies: ["Engine"], packageAccess: false)

 

Subclassing and Overrides

  • ๊ฐ ํ˜„์žฌ ์•ก์„ธ์Šค ๋ ˆ๋ฒจ์˜ ์‹ฌ๋ณผ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ override ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ‘œ

ํ˜„์žฌ

  • package๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •
    • ํ˜„์žฌ ์ž…๋ ฅํ•  ๋ณ„๋„์˜ ๊ทœ์น™์ด ์ •ํ•ด์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, ํ–ฅํ›„ ๋…ผ์˜๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •

Swift 5.9 ๊ธฐ์ค€

 

 

 

(์ฐธ๊ณ ๋งํฌ)

https://github.com/apple/swift-evolution/blob/main/proposals/0386-package-access-modifier.md?ref=fline.dev

 

swift-evolution/proposals/0386-package-access-modifier.md at main · apple/swift-evolution

This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - apple/swift-evolution

github.com

https://github.com/lgvv/wiki/issues/18

 

New access modifier: package · Issue #18 · lgvv/wiki

New access modifier: package Introduction ํ˜„์žฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ํŠน์ • ์‹ฌ๋ณผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” public์œผ๋กœ ์ •์˜๋˜์–ด์•ผ ํ•จ. public ํŒจํ‚ค์ง€ ๋‚ด์™ธ๋ถ€ ๋ชจ๋‘์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Œ. ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ์ ‘

github.com

 

Comments