рд╕реНрд╡рд┐рдлреНрдЯ 5.2ред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди

рдорд╛рд░реНрдЪ рдХреЗ рдЕрдВрдд рдореЗрдВ, Xcode 11.4 рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдлреНрдЯ 5.2 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд┐рджрд╛рди, рдирд┐рд░реНрднрд░рддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реНрд╡рд┐рдлреНрдЯрдкреАрдПрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред Habr├й рдкрд░ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ , рдЙрд╕реА рд▓реЗрдЦ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


 

рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ SE-0249 KeyPath


рд╢реЙрд░реНрдЯрдХрдЯ рдПрдХ рдХреБрдВрдЬреА рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЗрд╕рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рд╕рд░рд▓ рдореЙрдбрд▓ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдБ:

struct Model {
    let isHidden: Bool
}
 
let modelArray = [Model(isHidden: true), Model(isHidden: false)]

рдЖрдЗрд╕рд╣реЗрдб рдкреНрд░реЙрдкрд░реНрдЯреА рджреНрд╡рд╛рд░рд╛ рд╕рд░рдгреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВред рдиреАрдЪреЗ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде 3 рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ:

// 1
let funcIsHidden: (Model) -> Bool = \.isHidden
modelArray.filter(funcIsHidden)
 
// 2
modelArray.filter(\.isHidden as (Model) -> Bool)
 
// 3
modelArray.filter(\.isHidden)

рдШреЛрд╖рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ:

//   
let selfFunc: (Model) -> Model = \.self
modelArray.compactMap(selfFunc)
 
// ERROR: Expression type '(Model) -> Model' is ambiguous without more context
modelArray.compactMap(\.self as (Model) -> Model)
 
// ERROR: Key path value type 'Optional<_>' cannot be converted to contextual type '_'
modelArray.compactMap(\.self)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреАрдкреИрде рдХреЗ рд╡рд┐рдкрд░реАрдд, рдСрдЯреЛрдХреЙрдордкреНрд▓реЗрдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд▓реНрдЯрд░, рдореИрдк, рдХрдо, рд╕реЙрд░реНрдЯ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

SR-6118 рд╕рджрд╕реНрдпрддрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛ рд╕рдХрддреА рд╣реИ


рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдмреЙрдХреНрд╕ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдмрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рдиред

struct Box {
    let items: [String]
    
    subscript(_ index: Int = 0) -> String {
        items[index]
    }
}

рдЕрдм, рдкрд╣рд▓реЗ рддрддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

let box = Box(items: ["laptop, , mobile phone"])
let firstItem = box[] // "laptop"

SR-2189 рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╛рд╣рд░реА рджреГрд╢реНрдпрддрд╛ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ


рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо рдПрдХ рд╕реНрдерд╛рдиреАрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:

func getXPosition() {
    func calculateWidth(x: CGFloat = minX) -> CGFloat { ... }
    let minX: CGFloat = 0
    ...
}

рдХреИрд▓рдХреБрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо getXPosition рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

SE-0253 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


@DynamicCallable рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ "рд╕реНрдЯреИрдЯрд┐рдХ рдХреЙрд▓" рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдорд╛рдиреЛрдВ рдХреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдБ:

struct Player {
    private(set) var isRunning = false
    
    mutating func callAsFunction() {
        isRunning.toggle()
    }
}

рдкреНрд▓реЗрдпрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦреЗрдВ:

var player = Player()
print(player.isRunning) // false
player()
print(player.isRunning) // true

рдЙрд╕реА рд╕рдордп, рдЗрд╕реЗ рдбрд╛рд▓рдирд╛ рдордирд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдкрд╛рд╕ рдХрд░реЗрдВ:

// ERROR: Cannot convert value of type 'Player' to type '() -> Void' in coercion
let playerAsFunc = player as () -> Void

рдЖрдк рдХреНрд▓рд╛рд╕, рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ callAsFunction рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рддрд░реАрдХреЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

extension Player {
    func callAsFunction(isRunning: Bool = false) throws { ... }
    func callAsFunction() -> Bool { ... }
}

рдЖрд╡реЗрджрди рдЙрди рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдп, рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореВрд▓реНрдп рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдп рд╣реИред рдлрд┐рд░ рднреА, рдЖрдкрдХреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

SR-4206 рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдлрд┐рдХреНрд╕реНрдб рдмрдЧ


рдЕрдм, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрджрд▓ рдпрд╛ рдЬреЛрдбрд╝ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ CarBuilder рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

protocol PowerfullEngine { }
 
class CarBuilder {
  func add<T>(engine: T) {}
}
 
class MercedesBuilder: CarBuilder {
    //  
    override func add<T>(engine: T) {}
    // ERROR: Overridden method 'add' has generic signature <T where T : PowerfullEngine> which is incompatible with base method's generic signature <T>; expected generic signature to be <T>
    override func add<T: PowerfullEngine>(engine: T) {}
}

SR-11298 рд╡рд░реНрдЧ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛


рд╕реНрд╡рдпрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдореЗрдиреВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдПрдВ:

protocol Menu {}
 
class SideMenu: Menu {
  var sectionHeight = 0
}
 
extension Menu where Self: SideMenu {
  var menuHeight: Int {
    get { sectionHeight * 20 }
    set { sectionHeight = newValue / 20 }
  }
}

рдЙрд╕реА рд╕рдордп, рд╕реЗрдЯрд░ рдиреЙрдирдореБрдЯреЗрдЯрд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИред

SR-11429 рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯрд┐рдВрдЧ


рдЬрдм рд▓реЗрдмрд▓ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдЕрдм рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рд▓реЗрдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рдереА:

func setX(x: Int) {}
(setX as (Int) -> Void)(5)

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ:

func setPoint(x: Int, y: Int = 0) {}
(setPoint as (Int, Int) -> Void)(5, 1)

рдпрд╣ рдЬреЗрдирд░рд┐рдХ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдЕрдм рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИред

typealias Point<T> = T
func set(x: Int) {}
 
//  
(set as Point)(5) 
 
// ERROR: Extraneous argument label 'x:' in call
(set as Point)(x: 5) 

SR-11841 рдлрд╝рд┐рд▓реНрдЯрд░ (_ :) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреНрд░рдо рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ


рдПрдХ рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдБ рдФрд░ рдЧрд┐рдирддреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

let lazyArray = [0]
    .lazy
    .filter { _ in print("A"); return true }
    .filter { _ in print("B"); return true }
 
//  A B
_ = lazyArray.count

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд┐рдкрд░реАрдд рдерд╛: рдмреА рдПред

SR-2790 UnsafePointer / UnsafeBufferPointer рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░рддрд┐рдмрдВрдз рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рд░рдгрд┐рдпреЛрдВ, рдФрд░ рдЗрдирдСрдЙрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмрд╛рд╣рд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ UnsafePointer рд▓реЗрддрд╛ рд╣реИ:

struct Game {
    let info: UnsafePointer<Int8>
}
 
func createGame() {
    var i: Int8 = 0
    
    // WARNING: Initialization of 'UnsafePointer<Int8>' results in a dangling pointer
    _ = Game(info: .init(&i))
    
    // WARNING: Passing '[Int8]' to parameter, but argument 'character' should be a pointer that outlives the call to 'init(character:)'
    _ = Game(info: [1, 2])
    
    // WARNING: Passing 'String' to parameter, but argument 'character' should be a pointer that outlives the call to 'init(character:)
    _ = Game(info: "")
}

рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ 9 рдмрджрд▓рд╛рд╡ рд╣реБрдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреЗрд╢ рдХреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ KeyPath рд╣реЛрдЧрд╛ред

рдФрд░ рд╣рдо рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рддрддреНрдкрд░ рд╣реИрдВред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд╡рдпрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдХреНрд▓реЛрдЬрд┐рдВрдЧ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕реНрд╡рдпрдВ рдХрд╛ рдЙрдкрдпреЛрдЧред * ( SE-0269 ) рдФрд░ рдЬреЗрдирд░рд┐рдХ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ ( SE-0267 ) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛ред

рд╕реНрд░реЛрдд

All Articles